2011-10-18 31 views
5

Tôi có khung tổ chức EntityCollection.Cách xóa một tập hợp con các mục khỏi Bộ sưu tập Khung thực thể

Tôi cần phải xóa tất cả các mục khớp với mệnh đề where đã cho từ cơ sở dữ liệu. Đây là mã hiện tại của tôi:

// Perform the deletes 
foreach (var deleteReq in order.Requirements.Where(x=>!orderContract.Requirements.Any(y=>y.RequirementId==x.RequirementId))) 
{ 
    order.Requirements.Remove(deleteReq); 
} 

Về cơ bản tôi đang cố gắng để loại bỏ bất cứ điều gì từ bộ sưu tập order.Requirements đó không phải là trong bộ sưu tập orderContract.Requirements (kết hợp trên một Id).

Như bạn có thể đoán, mã này ném và ngoại lệ vì tôi đang sửa đổi bộ sưu tập mà tôi đang lặp lại.

Thông thường tôi chỉ sử dụng RemoveAll() nhưng EntityCollection không hỗ trợ phương thức đó.

Vậy ... Làm cách nào để xóa tất cả các bản ghi mà tôi cần?

+0

Tại sao bạn không thể thu thập các mục có thể tháo rời trong danh sách? kích thước bộ sưu tập lớn? –

Trả lời

11

Tôi tạo ra một danh sách riêng biệt và nó dường như đã làm việc:

// Perform the deletes 
var reqsToDelete = order.Requirements.Where(x=>!orderContract.Requirements.Any(y=>y.RequirementId==x.RequirementId)).ToList(); 
foreach (var deleteReq in reqsToDelete) 
{ 
    order.Requirements.Remove(deleteReq); 
} 

Bằng cách đó, khi tôi loại bỏ các mục từ danh sách order.Requirements, nó không ảnh hưởng đến danh sách đó tôi iterating.

6

thu thập tất cả các thực thể Yêu cầu bạn muốn xóa vào danh sách.

Sau đó xóa từng bộ sưu tập khỏi bộ sưu tập Thực thể yêu cầu thay vì từ thứ tự.Yêu cầu.

+0

Than ôi, tại vị trí tôi đang thực hiện việc xóa nó sẽ rất khó để có được bộ sưu tập thực thể Yêu cầu. (Tôi đang ở trong một AutoMapper ITypeConverter.) – Vaccano

+1

Ít nhất, bạn sẽ không thể xóa trong vòng lặp foreach, hãy thử thu thập nó trong một danh sách. Sau đó, bên ngoài vòng lặp, hãy thử xóa từng bước theo cách thủ công. – Birey

1

Trước EF6, có một phương pháp RemoveRange cho hiệu suất tốt hơn và API sạch

var deleteQuery = order 
    .Requirements 
    .Where(x=> !orderContract.Requirements.Any(y=>y.RequirementId == x.RequirementId)); 

order.Requirements.RemoveRange(deleteQuery); 

Bây giờ, EF sẽ không tải từng hạng mục trước khi loại bỏ, vì nó là một trường hợp trong câu trả lời chấp nhận.

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