2011-08-25 204 views
7

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

+1

你说的是LINQ-to-SQL吗? –

+0

我总是回复到存储过程,使用XML作为批量数据进行批量更新,但想知道它在LINQ中是否可行。 –

回答

5

听起来像你正在使用LINQ To SQL,你已经有了基础知识。

LINQ到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(); 
+0

是的,我明白如何做到这一点。我的问题只是询问是否有更简化的LINQ函数。 – esastincy

1

LINQ到SQL(或EF为此事),是所有关于把对象到内存中,操纵它们,然后使用每行的单独数据库请求更新它们。

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

9

这里的要求完全可以使用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年1月20日):这是一文不值,这是现在可以NuGet包的形式@https://www.nuget.org/packages/LinqPost/

Install-Package LinqPost 
+2

Upvoted避免RBAR,第一个答案是不正确的。 – Jasmine