如何使用ObjectContext删除对象列表?

时间:2012-12-14 06:30:04

标签: entity-framework objectcontext

假设你有这样的代码。

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逐个列表来执行此操作。感谢。

4 个答案:

答案 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的性能可能明显优于调用“移除多个” 时代会做到的。请注意,如果上下文中以“已添加”状态存在任何实体, 那么此方法将导致其与上下文分离。这是因为 假定数据库中不存在添加的实体,因此尝试删除 这没有道理。