2010-07-08 24 views
15

Con Marco de la entidad, que tratar de eliminar algunos objetos de mi contexto del objeto de esa manera:DeleteObject() en el bucle foreach

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

Con este código, tengo una excepción "Colección fue modificada".

Entonces, ¿cómo puedo hacer una eliminación por lotes?

Respuesta

26

Primero tiene que obtener los elementos que desea eliminar de la colección que va a modificar. Esto se puede hacer con una simple consulta LINQ (usando ToList() para forzar la ejecución):

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

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

O si te gusta la sintaxis compacta (no lo hago, en este caso), se puede utilizar:

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

Muy inteligente. Estaba escribiendo una respuesta similar, pero tú primero. – Jeroen

+2

Quizás sería interesante mencionar por qué .ToList() se agrega al final de la línea: var toDelete = context.Items.Where (i => i.Value> 50) .ToList(); ... y lo que causa :-) – Mariusz

4

En un foreach, cuando se modifica la Colección, se obtiene la excepción.

Solución: Copie su colección.

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

Inteligente. Incluso menos código que la primera respuesta. – Jeroen

+0

Me darías un +1, pero necesitas corregir tu sintaxis. –

+0

ah, perdón por eso @Justin. tenemos una extensión interna, de modo que todas las colecciones obtienen esa extensión foreach. Y eso se llama Cada(). y por cierto, si realiza tantas operaciones en una línea, ¡no olvide la documentación de la misma! – cRichter

Cuestiones relacionadas