2010-07-08 17 views
15

Con Entity Framework, cerco di eliminare alcuni oggetti dal mio contesto oggetto del genere:DeleteObject() nel ciclo foreach

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

Con questo codice, ho un'eccezione "Collection è stata modificata".

Quindi, come posso eliminare un lotto?

risposta

26

È necessario prima ottenere gli elementi che si desidera eliminare dalla raccolta che si intende modificare. È possibile farlo con una semplice query LINQ (utilizzando ToList() per forzare l'esecuzione):

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

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

Oppure, se vi piace la sintassi compatta (non lo faccio, in questo caso), è possibile utilizzare:

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

Molto intelligente. Stavo solo scrivendo una risposta simile ma tu eri il primo. – Jeroen

+2

Forse sarebbe interessante menzionare perché .ToList() viene aggiunto alla fine della riga: var toDelete = context.Items.Where (i => i.Value> 50) .ToList(); ... e ciò che provoca :-) – Mariusz

4

In un foreach, quando la raccolta viene modificata, si ottiene l'eccezione.

Soluzione: Copia la tua raccolta.

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

Intelligente. Ancora meno codice rispetto alla prima risposta. – Jeroen

+0

Avresti un +1 da parte mia, ma devi correggere la sintassi. –

+0

ah, mi dispiace per quel @Justin. abbiamo qualche estensione in casa, così tutte le raccolte ottengono quell'estensione foreach. E questo si chiama Each(). e BTW, se fai così tante operazioni in una riga, per favore non dimenticare la documentazione di esso! – cRichter