Linq to Entities删除而不提取

Ash*_*ani 8 c# linq linq-to-entities

这段代码可以:

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

是以某种方式写的,不需要先取出?就像是:

using(DbContext db = new DbContext())
{
    db.Settings.Remove(s=> s.UserId==Uid); 
}
Run Code Online (Sandbox Code Playgroud)

Adi*_*dov 7

当然可以做到:

如果UserId是主键:

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

如果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();
}
Run Code Online (Sandbox Code Playgroud)


Zei*_*kki 3

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

//delete all Settings where UserId matches
db.Settings.Where(s=> s.UserId == Uid).Delete();
Run Code Online (Sandbox Code Playgroud)

文件:

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