2010-07-08 6 views
15

Avec Entity Framework, je tente de supprimer des objets de mon contexte de l'objet comme ça:DeleteObject() dans la boucle foreach

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

Avec ce code, j'ai une exception "Collection a été modifiée".

Alors, comment puis-je faire un lot supprimer?

Répondre

26

Vous devez d'abord obtenir les éléments que vous souhaitez supprimer de la collection que vous allez modifier. Vous pouvez le faire avec une simple requête LINQ (en utilisant ToList() pour forcer l'exécution):

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

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

Ou si vous aimez la syntaxe compacte (je ne sais pas, dans ce cas), vous pouvez utiliser:

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

Très intelligent. J'écrivais juste une réponse similaire mais vous étiez le premier. – Jeroen

+2

Peut-être serait intéressant de mentionner pourquoi .ToList() est ajouté à la fin de la ligne: var toDelete = context.Items.Where (i => i.Value> 50) .ToList(); ... et ce qu'il fait :-) – Mariusz

4

Dans un foreach, lorsque la collection est modifiée, vous obtenez l'exception.

Solution: Copier votre collection.

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

Clever. Encore moins de code que la première réponse. – Jeroen

+0

Vous obtiendriez un +1 de moi, mais vous devez corriger votre syntaxe. –

+0

ah, désolé pour cela @ Justin. nous avons une extension dans la maison, comme cela toutes les collections obtiennent cela pour chaque extension. Et cela s'appelle Chaque(). et BTW, si vous le opérations beaucoup en une ligne, s'il vous plaît ne pas oublier la documentation de celui-ci! – cRichter