DeleteObject () dans une boucle foreach

.net c# database entity-framework

Question

Avec Entity Framework, j'essaie de supprimer certains objets de mon contexte d'objet de la manière suivante:

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

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

Alors, comment puis-je supprimer un lot?

Réponse acceptée

Vous devez d’abord extraire 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 (ce qui n'est pas le cas dans ce cas), vous pouvez utiliser:

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

Réponse populaire

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

Solution: Copiez votre collection.

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow