2010-07-08 47 views
15

Với Entity Framework, tôi cố gắng xóa một số đối tượng ra khỏi bối cảnh đối tượng của tôi như thế:DeleteObject() trong vòng lặp foreach

foreach (var item in context.Items.Where(i => i.Value > 50)) 
{ 
    context.Items.DeleteObject(item); 
} 

Với mã này, tôi có một ngoại lệ "Bộ sưu tập đã được sửa đổi".

Vì vậy, làm cách nào để xóa hàng loạt?

Trả lời

26

Trước tiên, bạn phải lấy các mục bạn muốn xóa khỏi bộ sưu tập mà bạn sẽ sửa đổi. Bạn có thể làm điều này với một truy vấn LINQ đơn giản (sử dụng ToList() để cưỡng chế thi hành):

var toDelete = context.Items.Where(i => i.Value > 50).ToList(); 

foreach(var item in toDelete) 
{ 
    context.Items.DeleteObject(item); 
} 

Hoặc nếu bạn thích cú pháp nhỏ gọn (tôi không, trong trường hợp này), bạn có thể sử dụng:

context.Items 
    .Where(i => i.Value > 50) 
    .ToList() 
    .ForEach(item => context.Items.DeleteObject(item)); 
+0

Rất thông minh. Tôi chỉ viết một câu trả lời tương tự nhưng trước tiên bạn đã viết. – Jeroen

+2

Có lẽ sẽ thú vị khi đề cập đến lý do tại sao .ToList() được thêm vào cuối dòng: var toDelete = context.Items.Where (i => i.Value> 50) .ToList(); ... và những gì nó gây ra :-) – Mariusz

4

Trong một foreach, khi Bộ sưu tập được sửa đổi, bạn sẽ nhận được ngoại lệ.

Giải pháp: Sao chép bộ sưu tập của bạn.

context.Items.Where(i => i.Value > 50).ToList().ForEach(item => context.Items.Remove(item)); 
+0

Thông minh. Thậm chí ít mã hơn câu trả lời đầu tiên. – Jeroen

+0

Bạn sẽ nhận được +1 từ tôi, nhưng bạn cần sửa cú pháp của mình. –

+0

ah, xin lỗi vì điều đó @Justin. chúng tôi có một số phần mở rộng trong nhà, giống như tất cả các bộ sưu tập có được phần mở rộng foreach đó. Và đó được gọi là Mỗi(). và BTW, nếu bạn hoạt động quá nhiều trong một dòng, vui lòng không quên tài liệu về nó! – cRichter

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