批量删除LINQ to Entities

有没有办法批量删除LINQ或LINQ-to-Entities中匹配给定查询的一堆对象? 我能find的唯一的引用是过时的,似乎很愚蠢的反复,并手动删除所有我想删除的对象。

问题是一个旧的(从EF5存在之前)。 对于任何使用EF5的人来说, EntityFramework.Extended都可以快速完成。

前一段时间,我写了一个4部分的博客系列(第1,2,3和4部分 ),内容包括在entity framework中进行批量更新(使用一个命令)。

虽然该系列的重点是更新,但您可以确定使用涉及的原则进行删除。

所以你应该可以写这样的东西:

 var query = from c in ctx.Customers where c.SalesPerson.Email == "..." select c; query.Delete(); 

所有你需要做的就是实现Delete()扩展方法。 看到后系列提示如何…

希望这可以帮助

  using (var context = new DatabaseEntities()) { // delete existing records context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId); } 

我在这里看到的答案是Linq to Sql

DeleteAllOnSubmit是System.Data.Linq和Linq to Sql的ITable的一部分

这不能用entity framework来完成。

说了这么多,我还没有解决scheme,但是当我这样做的时候会回来

对于那些使用EF6并希望执行行SQL查询删除操作的用户:

 using (var context = new DatabaseEntities()) { // delete existing records context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter); } 

我知道任何数据上下文的DeleteAllOnSubmit方法将删除查询中的所有logging。 由于许多对象被删除,所以必须有一些优化的基础。 我不确定。

我不确定它会有多高效,但是你可以尝试这样的事情:

 // deletes all "People" with the name "Joe" var mypeople = from p in myDataContext.People where p.Name == "Joe"; select p; myDataContext.People.DeleteAllOnSubmit(mypeople); myDataContext.SubmitChanges(); 

YOu可以写一个存储过程,执行删除,并从LINQ调用它。 一个基于集合的删除可能总体上更快,但如果它影响太多的logging,你可能会导致locking问题,你可能需要循环的logging集合(可能一次20​​00,大小取决于你的数据库devise,但2000是一个混合开始的地方,如果你发现基于集合的delte需要这么长时间,它正在影响其他使用表)做删除。

通过entity framework删除数据依赖于使用DeleteObject方法。 您可以在EntityCollection上为要删除的实体类或派生的ObjectContext调用此方法。 这是一个简单的例子:

 NorthwindEntities db = new NorthwindEntities(); IEnumerable<Order_Detail> ods = from o in db.Order_Details where o.OrderID == 12345 select o; foreach (Order_Detail od in ods) db.Order_Details.DeleteObject(od); db.SaveChanges(); 

我会做这样的事情:

 var recordsToDelete = (from c in db.Candidates_T where c.MyField == null select c).ToList<Candidates_T>(); if(recordsToDelete.Count > 0) { foreach(var record in recordsToDelete) { db.Candidate_T.DeleteObject(record); db.SaveChanges(); } } 

我不认为有没有一个循环,因为entity framework与实体工作,大部分时间,这意味着收集的对象。

在这个例子中,我得到要删除的logging,并逐个将它们附加到结果集,然后请求删除它们。 然后我有1个保存更改。

  using (BillingDB db = new BillingDB()) { var recordsToDelete = (from i in db.sales_order_item where i.sales_order_id == shoppingCartId select i).ToList<sales_order_item>(); if(recordsToDelete.Count > 0) { foreach (var deleteSalesOrderItem in recordsToDelete) { db.sales_order_item.Attach(deleteSalesOrderItem); db.sales_order_item.Remove(deleteSalesOrderItem); } db.SaveChanges(); } } 
  context.Entity.Where(p => p.col== id) .ToList().ForEach(p => db.Entity.DeleteObject(p)); 

这些是使用EF删除数据库logging的最快方法

在EF6中引入了RemoveRange,它可以删除一个对象列表。 超级简单。

 var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList(); db.PermitOrigins.RemoveRange(origins); db.SaveChanges();