2010-07-08 19 views
15

z Entity Framework, próbuję usunąć niektóre obiekty z mojego obiektu kontekście tak:DeleteObject() w pętli foreach

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

Z tego kodu, mam „Kolekcja została zmodyfikowana” wyjątek.

Jak mogę usunąć partię?

Odpowiedz

26

Musisz najpierw pobrać elementy, które chcesz usunąć z kolekcji, którą zamierzasz zmodyfikować. Można to zrobić za pomocą prostego zapytania LINQ (przy użyciu ToList(), aby wymusić wykonanie):

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

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

lub jeśli chcesz zwartej składni (nie w tym przypadku), można użyć:

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

Bardzo sprytny. Właśnie pisałem podobną odpowiedź, ale byłeś pierwszy. – Jeroen

+2

Być może byłoby interesujące wspomnieć, dlaczego .ToList() jest dodawany na końcu wiersza: var toDelete = context.Items.Where (i => i.Value> 50) .ToList(); ... i co powoduje :-) – Mariusz

4

W foreach, gdy kolekcja jest modyfikowana, otrzymujesz wyjątek.

Rozwiązanie: Skopiuj swoją kolekcję.

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

Sprytny. Jeszcze mniej kodu niż pierwsza odpowiedź. – Jeroen

+0

Otrzymasz ode mnie +1, ale musisz poprawić swoją składnię. –

+0

ah, przepraszam za to @ Justin. mamy pewne rozszerzenie w domu, tak jak wszystkie zbiory otrzymują przedłużenie foreach. A to nazywa się Each(). i BTW, jeśli tak wiele operacji w jednym wierszu, nie zapomnij o dokumentacji! – cRichter