2011-08-25 42 views
7

Có cách nào để cập nhật hàng loạt trên bộ sưu tập với LINQ không? Hiện tại nếu tôi có List<myObject> và tôi muốn cập nhật cột1 thành TEST bằng nhau cho mỗi hàng trong Danh sách tôi sẽ thiết lập vòng lặp foreach và sau đó cho mỗi đối tượng riêng lẻ, tôi sẽ đặt giá trị và sau đó lưu nó. Điều này hoạt động tốt nhưng tôi đã chỉ tự hỏi nếu có một số phương pháp LINQ ra có nơi tôi có thể làm một cái gì đó như myOject.BulkUpdate(columnName, value)?Cập nhật hàng loạt với LINQ to SQL

+1

Bạn đang nói về LINQ-To-SQL? –

+0

Tôi luôn hoàn nguyên các thủ tục được lưu trữ để thực hiện cập nhật hàng loạt bằng cách sử dụng XML làm dữ liệu hàng loạt, nhưng muốn biết liệu có thể thực hiện trong LINQ hay không. –

Trả lời

5

Có vẻ như bạn đang sử dụng LINQ to SQL và bạn đã có những điều cơ bản đã được trình bày.

LINQ to SQL là về trừu tượng hóa bảng thành các lớp và không thực sự cung cấp 'dấu đầu dòng bạc' hoặc một lớp lót mà bạn đang tìm kiếm.

Cách duy nhất để làm điều đó là để đạt được một lớp lót của bạn sẽ làm cho một proc được lưu trữ để có tên cột và giá trị mới, và thực hiện logic đó cho mình.

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. */ 

Nếu không, nó như bạn mô tả:

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

Có, tôi hiểu cách thực hiện điều này. Câu hỏi của tôi là chỉ hỏi nếu có một hàm LINQ được sắp xếp hợp lý hơn. – esastincy

1

LINQ to SQL (hoặc EF cho rằng vấn đề), là tất cả về việc đưa đối tượng vào bộ nhớ, thao túng họ, và sau đó cập nhật chúng với các yêu cầu cơ sở dữ liệu riêng biệt cho mỗi hàng.

Trong trường hợp bạn không cần phải hydrate toàn bộ đối tượng trên máy khách, tốt hơn hết là nên sử dụng các thao tác bên máy chủ (procs được lưu trữ, TSQL) thay vì LINQ. Bạn có thể sử dụng các nhà cung cấp LINQ để phát hành TSQL dựa vào cơ sở dữ liệu. Ví dụ: với LINQ to SQL, bạn có thể sử dụng context.ExecuteCommand ("Cập nhật trường bảng thiết lập = giá trị ở điều kiện"), chỉ xem ra cho SQL Injection.

9

Yêu cầu của bạn ở đây hoàn toàn có thể sử dụng biểu thức LINQ và thư viện tuyệt vời của Terry Aney về chủ đề này.

Batch Updates and Deletes with LINQ to SQL

Bản cập nhật trong các điều khoản của ví dụ bạn đưa ra sẽ như sau:

using BTR.Core.Linq; 
... 

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

Chỉnh sửa (2017/01/20): Nó có giá trị gì này hiện đang có sẵn dưới hình thức gói NuGet @https://www.nuget.org/packages/LinqPost/.

Install-Package LinqPost 
+2

Được thăng hạng để tránh RBAR, câu trả lời đầu tiên không thực sự chính xác. – Jasmine

Các vấn đề liên quan