假设你有这样的代码。
using (CustomerContext db = new CustomerContext())
{
var foundCustList=db.Customers.Where(c=>c.State=='-1').ToList();//Find all the customer which State is -1
foreach(var c in foundCustList)
{
db.DeleteObject(c);
}
db.SaveChanges();//After all the customer is deleted, Commit.
}
但我想知道有没有办法轻松删除对象列表?我不想使用foreach
逐个列表来执行此操作。感谢。
答案 0 :(得分:15)
您可以使用Nuget提供的EntityFramework.Extended库(不要忘记添加using EntityFramework.Extensions;
):
db.Customers.Delete(c => c.State == '-1');
或者您可以手动编写扩展方法:
public static void DeleteObjects<T>(this ObjectSet<T> set,
IEnumerable<T> entities)
where T : EntityObject
{
foreach (var entity in entities)
set.DeleteObject(entity);
}
用法:
var customersToDelete = db.Customers.Where(c => c.State == '-1');
db.Customers.DeleteObjects(customersToDelete);
或者更好的一个:
public static void DeleteObjects<T>(this ObjectSet<T> set,
Expression<Func<T, bool>> predicate)
where T : EntityObject
{
foreach (var entity in set.AsQueryable<T>().Where(predicate))
set.DeleteObject(entity);
}
用法:
db.Customers.DeleteObjects(c => c.State == '-1');
答案 1 :(得分:9)
上面接受的答案已过时,因为语法已被弃用,而不是删除简单查询:
db.Customers.Where(c => c.State == '-1').Delete();
答案 2 :(得分:6)
db.Customers.Where(c => c.State == '-1').ToList().ForEach(db.DeleteObject);
db.SaveChanges();
应该就是您所需要的一切。
答案 3 :(得分:2)
实体框架核心
3.1 3.0 2.2 2.1 2.0 1.1 1.0
using (CustomerContext db = new CustomerContext())
{
var foundCustList=db.Customers.Where(c=>c.State=='-1').ToList();//Find all the customer which State is -1
db.Customers.RemoveRange(foundCustList);
db.SaveChanges();//After all the customer is deleted, Commit.
}
摘要:
从集合下的上下文中删除给定的实体集合 每个实体都处于Deleted状态,以便将其删除 从数据库中调用SaveChanges时。
备注:
请注意,如果System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabled 设置为true(这是默认值),那么DetectChanges将被调用一次 删除任何实体之前,将不会再次调用。这意味着在某些情况下 这种情况下,RemoveRange的性能可能明显优于调用“移除多个” 时代会做到的。请注意,如果上下文中以“已添加”状态存在任何实体, 那么此方法将导致其与上下文分离。这是因为 假定数据库中不存在添加的实体,因此尝试删除 这没有道理。