Linq to Entities 删除而不获取

9

这段代码能否实现:

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个回答

7
当然可以做到:
如果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();
}

如何在范围内使用它? - Ashkan Mobayen Khiabani
很抱歉,我以为 UserId 是一个键,没有注意到它是 IEnumerable。如果你知道 PK,就可以完成这个操作。你可以根据 UserId 获取 PK,然后在 foreach 循环中删除它们。我会编辑我的答案。 - Adil Mammadov
请问您能否加入我的聊天室?聊天室 - Ashkan Mobayen Khiabani

3
你可以查看EntityFramework.Extended库,它为你提供了以下查询写法:
//delete all Settings where UserId matches
db.Settings.Where(s=> s.UserId == Uid).Delete();

文档:

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


链接不正确。我已经添加了EntityFramework.Extended的NuGet包,但是我没有看到任何删除方法。 - Ashkan Mobayen Khiabani
@AshkanMobayenKhiabani 你需要添加using语句才能看到这些扩展。我已更新参考链接。 - Zein Makki
非常好的回答。非常感谢。 - Ashkan Mobayen Khiabani

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接