12

假设您有这样的代码。

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.
}

但我想知道有没有办法轻松删除对象列表?我不想用foreachlist 一个一个来做。谢谢。

4

4 回答 4

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');
于 2012-12-14T06:52:50.417 回答
10

上面接受的答案已经过时,因为语法已被弃用,而是删除了一个简单的查询:

db.Customers.Where(c => c.State == '-1').Delete();
于 2016-07-01T01:15:06.563 回答
6
db.Customers.Where(c => c.State == '-1').ToList().ForEach(db.DeleteObject);
db.SaveChanges();

应该是你所需要的。

于 2012-12-14T06:34:33.410 回答
3

实体框架核心

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.
}

摘要

从集合底层的上下文中删除给定的实体集合,每个实体都处于已删除状态,以便在调用 SaveChanges 时将其从数据库中删除。

备注

请注意,如果 System.Data.Entity.Infrastructure.DbContextConfiguration.AutoDetectChangesEnabled 设置为 true(这是默认设置),则 DetectChanges 将在删除任何实体之前调用一次,并且不会再次调用。这意味着在某些情况下,RemoveRange 的性能可能比多次调用 Remove 的性能要好得多。请注意,如果上下文中存在处于已添加状态的任何实体,则此方法将导致它与上下文分离。这是因为假定数据库中不存在已添加的实体,因此尝试删除它没有意义。

于 2020-01-07T07:59:41.483 回答