2011-10-18 11 views
5

Mam strukturę obiektu EntityCollection.Jak usunąć podzbiór elementów z kolekcji Entity Framework

Należy usunąć z bazy danych wszystkie elementy pasujące do podanej klauzuli where. To jest mój istniejącego kodu:

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

Zasadniczo próbuję wyjąć coś z kolekcji order.Requirements którego nie ma w kolekcji orderContract.Requirements (pasująca na Id).

Jak można się domyślić, ten kod rzuca i robi wyjątek, ponieważ modyfikuję kolekcję, którą powtarzam.

Normalnie chciałbym użyć tylko RemoveAll(), ale EntityCollection nie obsługuje tej metody.

Więc ... Jak mogę usunąć wszystkie potrzebne rekordy?

+0

Dlaczego nie można zbierać wymiennych elementów na liście? rozmiar kolekcji jest duży? –

Odpowiedz

11

stworzyłem listę oddzielna i wydaje się, że pracował:

// 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); 
} 

ten sposób, kiedy mogę usunąć element z listy order.Requirements, nie wpływając na listy, że jestem Iterowanie.

6

zebranie wszystkich elementów Wymaganie, które chcesz usunąć, do listy.

Następnie usuń każdy z tych elementów z kolekcji Requirements zamiast z order.Requirements.

+0

Niestety, w miejscu, w którym robię usuwanie, bardzo trudno byłoby uzyskać kolekcję elementów Requirements. (Jestem w AutoMapper ITypeConverter.) – Vaccano

+1

Przynajmniej nie będziesz w stanie usunąć w pętli foreach, spróbuj zebrać ją na liście. Następnie poza pętlą spróbuj usunąć każdy z nich ręcznie. – Birey

1

Przed EF6, istnieje RemoveRange metoda dla lepszej wydajności i czystszego API

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

order.Requirements.RemoveRange(deleteQuery); 

Teraz EF przyzwyczajenie załadować każdy element przed usunięciem, jak to miało miejsce w akceptowanych odpowiedź.