使用LINQ to SQL进行批量更新

时间:2011-08-25 15:48:15

标签: linq-to-sql

有没有办法使用LINQ对集合进行批量更新?目前,如果我有List<myObject>并且我想将列1更新为等于列表中每一行的TEST,我将设置一个foreach循环,然后对于每个单独的对象,我将设置该值,然后保存它。这工作正常,但我只是想知道是否有一些LINQ方法,我可以做myOject.BulkUpdate(columnName, value)之类的东西?

3 个答案:

答案 0 :(得分:10)

这里的要求完全可以使用Linq表达式和Terry Aney关于此主题的优秀图书馆。

Batch Updates and Deletes with LINQ to SQL

您提供的示例条款中的更新如下:

using BTR.Core.Linq;
...

Context.myObjects.UpdateBatch
(
    Context.myObjects.Where(x => x.columnName != value),
    x => new myObject { columnName = value}
);

编辑(2017-01-20):现在以NuGet包@ https://www.nuget.org/packages/LinqPost/的形式提供此功能并不值得。

Install-Package LinqPost

答案 1 :(得分:5)

听起来你正在使用LINQ To SQL,而且你已经掌握了基础知识。

LINQ To SQL是关于将表抽象为类,并不真正提供您正在寻找的“银弹”或单行。

实现这一目标的唯一方法是实现你的单行程序,使存储过程获取该列名和新值,并自己实现该逻辑。

 db.MassUpdateTableColumn("Customer", "Name", "TEST");

 ....
 CREATE PROC MassUpdateTableColumn
    @TableName varchar(100), @ColumnName varchar(100), @NewVal varchar(100)
 AS
    /*your dynamic SQL to update a table column with a new val. */

否则,就像你描述的那样:

 List<Customer> myCusts = db.Customers.ToList();
 foreach(Customer c in myCusts)
 {
     c.Name = "TEST";
 }     
 db.SubmitChanges();

答案 2 :(得分:1)

LINQ to SQL(或者就此而言的EF),就是将对象放入内存,操作它们,然后使用每行的单独数据库请求更新它们。

如果您不需要在客户端上对整个对象进行水合,则最好使用服务器端操作(存储过程,TSQL)而不是LINQ。您可以使用LINQ提供程序对数据库发出TSQL。例如,使用LINQ to SQL,您可以使用context.ExecuteCommand(“Update table set field = value where condition”),只需注意SQL Injection