如何在Linq中运行批量更新/删除查询?

Sha*_*ica 8 .net c# linq linq-to-sql

我有2个Linq2Sql类:ParentChild.我想做一些事情,比如删除父母的所有孩子,或更新所有子记录.在SQL中我会写:

delete Child where ParentID = @p
Run Code Online (Sandbox Code Playgroud)

要么

update Child set Val = Val+1 where ParentID = @p
Run Code Online (Sandbox Code Playgroud)

我可以在Linq中以蛮力的方式在Parent课堂内这样做:

Children.ToList().ForEach(c => c.DeleteOnSubmit()); // DeleteOnSubmit is my own method
Run Code Online (Sandbox Code Playgroud)

Children.ToList().ForEach(c => c.Val++);
Run Code Online (Sandbox Code Playgroud)

但鉴于Linq对ForEach循环的固有性能损失,这似乎是一种非常低效的方法.是否有某种方法可以实现所需的结束,只会触发一个查询?

Kon*_*man 14

对于这些情况,您可以使用DataContext.ExecuteCommand方法直接在数据库上执行SQL.例如:

dataContext.ExecuteCommand("delete Child where ParentID = {0}", parentId);
Run Code Online (Sandbox Code Playgroud)

  • @Shaul,在大多数情况下,是的,但LINQ-To-SQL不支持批量更新/删除,所以这是你的选择.另一种选择是存储过程. (3认同)

pdi*_*ddy 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/ [可能是正确的]

  • @Shaul现在这可能是一个很好的答案,但链接只有答案有这个问题迟早会变得毫无价值,因为无法再达到外部资源.在这里编写解决方案的至少一部分总是更好,所以只要SO存在就可以使用它. (2认同)