我有2个Linq2Sql类:Parent
和Child
。我想做一些事情,比如删除父母的所有孩子,或更新所有子记录。在SQL中我会写:
delete Child where ParentID = @p
或
update Child set Val = Val+1 where ParentID = @p
我可以在Linq中以Parent
类内部的强力方式执行此操作:
Children.ToList().ForEach(c => c.DeleteOnSubmit()); // DeleteOnSubmit is my own method
和
Children.ToList().ForEach(c => c.Val++);
但鉴于Linq对ForEach循环的固有性能损失,这似乎是一种非常低效的方法。是否有某种方法可以实现所需的结束,只会触发一个查询?
答案 0 :(得分:14)
对于这些情况,您可以使用DataContext.ExecuteCommand method直接在数据库上执行SQL。例如:
dataContext.ExecuteCommand("delete Child where ParentID = {0}", parentId);
答案 1 :(得分:9)
看看这个链接:它正在使用ExpressionTree: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx [Broken Link]
http://terryaney.wordpress.com/2008/04/14/batch-updates-and-deletes-with-linq-to-sql/ [可能是正确的]
答案 2 :(得分:2)
使用linq查看http://magiq.codeplex.com群发操作。
答案 3 :(得分:1)
更新和删除
实体框架的当前限制是,为了更新或删除实体,您必须首先将其检索到内存中。此外,对于单个删除,必须先检索该对象,然后才能删除该对象,从而需要对数据库进行两次调用。为了克服这个问题,我们必须使用EntityFramework.Extended扩展当前的实体框架。 EntityFramework.Extended具有有用的功能,如批量更新和删除,审核日志,查询结果缓存,未来查询。批量更新和删除消除了在修改实体之前检索和加载实体的需要。以下是几行代码,用于演示如何删除,更新。
通过nuget安装
<强> PM&GT; Install-Package EntityFramework.Extended
<强>更新强>
场景:更新拥有美国国家/地区的客户。 如果我们在没有任何扩展的情况下执行此操作,我们必须获取具有country USA的所有客户,修改列表并使用循环更新它。使用Entity Framework.Exdended我们不需要获取客户列表,只需添加where条件,设置更新数据和执行查询。
static void Main(string[] args)
{
using(var db = new DataContext())
{
db.Customers.Where(c => c.Country == "USA").Update(c => new Customer()
{
Country = "IN"
});
foreach(var customer in db.Customers.ToList())
{
Console.WriteLine("CustomerInfo - {0}-{1}-{2}", customer.Name, customer.Country, customer.Status);
}
}
Console.ReadLine();
}
https://code.msdn.microsoft.com/entity-framework-batch-994cd739
答案 4 :(得分:-1)
试试这个
_db.tblStockAllocationEurails.Where(t => t.StockNo >= From && t.StockNo <= To).ToList().ForEach(t => t.StatusID = NewGuid);
_db.SaveChanges();