Cập nhật nhiều hàng trong Entity Framework từ danh sách id


95

Tôi đang cố gắng tạo một truy vấn cho khung thực thể sẽ cho phép tôi lấy danh sách id và cập nhật trường được liên kết với chúng.

Ví dụ trong SQL:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

Làm cách nào để chuyển đổi ở trên thành khung thực thể?


Nền tảng cơ sở dữ liệu Oracle mysql của bạn là gì ..
zee

Cơ sở dữ liệu của tôi là Microsoft SQL
mã hóa

Có hai dự án mã nguồn mở cho phép điều này: EntityFramework.Extended và E ntity Framework Extensions .
Peter Kerr

Câu trả lời đúng duy nhất cho điều này là: bạn không thể. Chắc chắn, bạn có thể lấy tất cả các Friends khớp từ cơ sở dữ liệu và cập nhật thuộc tính của chúng msgSentByvà lưu các thay đổi. Nhưng EF sẽ kích hoạt các UPDATEcâu lệnh cho từng bản ghi riêng lẻ. Điều đó hoàn toàn không giống với cập nhật hàng loạt một câu lệnh. Như đã nói, hãy tìm thư viện của bên thứ ba cung cấp cập nhật hàng loạt.
Gert Arnold

Câu trả lời:


167

một cái gì đó như dưới đây

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

CẬP NHẬT:

bạn có thể cập nhật nhiều trường như bên dưới

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

Tôi có thể cập nhật nhiều hơn một trường trong phần trước mà bạn vừa gửi đến, đó là chính xác những gì tôi yêu cầu. chỉ tò mò nếu bạn có thể làm nhiều hơn? Cũng có vẻ như SubmitChanges không hoạt động nữa. Tôi đang sử dụng khung thực thể mới nhất. Có thể SaveChanges ()?
báo trước

10
ForEachlà một phương thức trên List, và thường không được khuyến khích sử dụng vì nó không phải là một cách lập trình có nhiều chức năng. Chỉ cần sử dụng foreach (người điều hành) như một người bình thường.
BlueRaja - Danny Pflughoeft

55
Sử dụng giải pháp này tạo một truy vấn cập nhật cho mỗi phần tử trong danh sách. Có cách nào để EF thực hiện chỉ một truy vấn như trong câu hỏi không? ( UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...))
RamNow

19
Cần biết rằng đây là một cách khá kém hiệu quả để giải quyết vấn đề này từ góc độ cơ sở dữ liệu. Điều này không chỉ đưa ra một câu lệnh lựa chọn lớn liên quan đến mọi hàng từ bảng Bạn bè, mà còn đưa ra một lệnh CẬP NHẬT riêng cho mọi bản ghi được cập nhật. Vì vậy, thay vì đưa ra một lệnh, bạn có thể gặp nhiều vấn đề với nhiều lệnh cũng như truyền một loạt dữ liệu ra khỏi cơ sở dữ liệu của bạn.
d512

1
@ShekharPankaj, về cơ bản những gì bạn muốn làm là đưa ra một lệnh SQL như "UPDATE Friends SET msgSentBy = '1234' WHERE ID IN (1, 2, 3, 4)". Tôi không nghĩ rằng EF có hỗ trợ trực tiếp để làm điều đó. Tôi tin rằng có một số giải pháp của bên thứ 3 cho vấn đề này ( stackoverflow.com/questions/12751258/batch-update-delete-ef5 ) nhưng tôi chưa sử dụng chúng. Các tùy chọn khác là sử dụng ADO.NET thô thay vì EF.
d512

-1
var idList=new int[]{1, 2, 3, 4};
var friendsToUpdate = await Context.Friends.Where(f => 
    idList.Contains(f.Id).ToListAsync();

foreach(var item in previousEReceipts)
{
  item.msgSentBy = "1234";
}

Bạn có thể sử dụng foreach để cập nhật từng phần tử đáp ứng điều kiện của bạn.

Đây là một ví dụ theo cách chung chung hơn:

var itemsToUpdate = await Context.friends.Where(f => f.Id == <someCondition>).ToListAsync();

foreach(var item in itemsToUpdate)
{
   item.property = updatedValue;
}
Context.SaveChanges()

Nói chung, bạn có thể sẽ sử dụng các phương thức không đồng bộ với các truy vấn await cho db.


Tôi không hiểu làm thế nào điều này thêm bất cứ điều gì vào câu trả lời hiện có. Về cơ bản nó chỉ lặp lại nó.
Gert Arnold
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.