2011-08-25 201 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