DeleteObject() в цикле foreach

В Entity Framework я пытаюсь удалить некоторые объекты из моего контекста объектов следующим образом:

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

С помощью этого кода у меня есть исключение "Collection Was Modified".

Итак, как я могу сделать пакетное удаление?

Ответы

Ответ 1

Сначала вы должны получить элементы, которые хотите удалить, из коллекции, которую собираетесь изменить. Вы можете сделать это с помощью простого запроса LINQ (используя ToList() для принудительного выполнения):

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

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

Или, если вам нравится компактный синтаксис (в данном случае я этого не делаю), вы можете использовать:

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

Ответ 2

В foreach, когда коллекция изменяется, вы получаете исключение.

Решение: Скопируйте свою коллекцию.

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