这段代码可以:
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);
}
答案 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(..)