Linq to Entities 删除而不获取

Linq to Entities Remove without fetching

这个代码可以吗:

using(DbContext db = new DbContext())
{
    IEnumerable<Setting> settings = db.Settings.Where(s=> s.UserId==Uid);
    db.Settings.RemoveRange(settings); 
}

以某种不需要先获取的方式编写?类似于:

using(DbContext db = new DbContext())
{
    db.Settings.Remove(s=> s.UserId==Uid); 
}

当然可以:

如果UserId是主键:

using(DbContext db = new DbContext())
{
    Setting settingToRemove = new Setting { UserId = Uid };
    db.Entry(settingToRemove).State = EntityState.Deleted;
    db.SaveChanges();
}

如果UserId不是键你必须查询数据库,但你需要的只是获取主键根据UserId.

using(DbContext db = new DbContext())
{
    List<int> settingIdsToRemove = db.Setting
        .Where(m => m.UserId == Uid)
        .Select(m => m.Id)
        .ToList();

    foreach(int settingId in settingIdsToRemove)
    {
        Setting settingToRemove = new Setting { Id = settingId };
        db.Entry(settingToRemove).State = EntityState.Deleted;
    }

    db.SaveChanges();
}

您可以查看 EntityFramework.Extended 库,它可以让您编写以下查询:

//delete all Settings where UserId matches
db.Settings.Where(s=> s.UserId == Uid).Delete();

文档:

A current limitations of the Entity Framework is that in order to update or delete an entity you have to first retrieve it into memory. Now in most scenarios this is just fine. There are however some scenarios where performance would suffer. Also, for single deletes, the object must be retrieved before it can be deleted requiring two calls to the database. Batch update and delete eliminates the need to retrieve and load an entity before modifying it.

如果您不想在 foreach 循环中花费时间,唯一的方法是

db.Database.ExecuteSqlCommand(..)

https://msdn.microsoft.com/en-us/library/system.data.entity.database.executesqlcommand(v=vs.113).aspx