Linq to Entities删除而不提取

时间:2016-08-15 10:29:12

标签: c# linq linq-to-entities

这段代码可以:

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); 
}

3 个答案:

答案 0 :(得分:6)

当然可以做到:

如果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();
}

答案 1 :(得分:3)

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

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

文档:

  

实体框架的当前限制是为了   更新或删除您必须首先将其检索到内存中的实体。   现在在大多数情况下,这很好。但有一些   性能会受到影响的场景。此外,对于单个删除,   必须先检索该对象,然后才能删除该对象   调用数据库。批量更新和删除消除了需要   在修改实体之前检索并加载实体。

答案 2 :(得分:2)

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

db.Database.ExecuteSqlCommand(..)

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