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(..)
这个代码可以吗:
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(..)