有什么方法可以在LINQ或LINQ-to-Entities中批量删除与给定查询匹配的一堆对象?我能找到的唯一参考文献已过时,并且遍历并手动删除所有我希望删除的对象似乎很愚蠢。
有什么方法可以在LINQ或LINQ-to-Entities中批量删除与给定查询匹配的一堆对象?我能找到的唯一参考文献已过时,并且遍历并手动删除所有我希望删除的对象似乎很愚蠢。
Answers:
问题是一个古老的问题(来自EF5之前的问题)。对于使用EF5的任何人,EntityFramework.Extended都会快速完成此操作。
using (var context = new DatabaseEntities())
{
// delete existing records
context.ExecuteStoreCommand("DELETE FROM YOURTABLE WHERE CustomerID = {0}", customerId);
}
对于那些使用EF6并希望执行行SQL查询以进行删除的用户:
using (var context = new DatabaseEntities())
{
// delete existing records
context.Database.ExecuteSqlCommand("DELETE FROM YOURTABLE WHERE CustomerID = @id", idParameter);
}
RemoveRange是EF6中引入的,它可以删除对象列表。超级容易。
var origins= (from po in db.PermitOrigins where po.PermitID == thisPermit.PermitID select po).ToList();
db.PermitOrigins.RemoveRange(origins);
db.SaveChanges();
我知道任何数据上下文的DeleteAllOnSubmit方法,它将删除查询中的所有记录。由于要删除许多对象,因此必须进行一些优化。我不确定。
我不确定效率如何,但是您可以尝试执行以下操作:
// 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();
通过实体框架删除数据依赖于使用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();
在此示例中,我删除了记录,然后将它们一个接一个地附加到结果集,然后请求将其删除。然后我有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从数据库删除记录的最快方法
我会做类似的事情:
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与Entities一起使用,并且在大多数情况下,这意味着对象的集合。