foreach循环中的DeleteObject()

Pat*_*ier 18 .net c# database entity-framework

使用Entity Framework,我尝试从我的对象上下文中删除一些对象:

foreach (var item in context.Items.Where( i => i.Value > 50 ) )
{
   context.Items.DeleteObject(item);
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,我有一个"Collection Was Modified"异常.

那么,我该如何进行批量删除呢?

Jus*_*ner 28

您必须首先从要修改的集合中获取要删除的项目.您可以使用简单的LINQ查询(使用ToList()强制执行)来执行此操作:

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

foreach(var item in toDelete)
{
    context.Items.DeleteObject(item);
}
Run Code Online (Sandbox Code Playgroud)

或者如果您喜欢紧凑语法(在本例中我不喜欢),您可以使用:

context.Items
    .Where(i => i.Value > 50)
    .ToList()
    .ForEach(item => context.Items.DeleteObject(item));
Run Code Online (Sandbox Code Playgroud)

  • 也许有趣的是要提到为什么.ToList()被添加到行的末尾:var toDelete = context.Items.Where(i => i.Value> 50).ToList(); ......以及它的原因:-) (2认同)

cRi*_*ter 6

在foreach中,当修改Collection时,您将获得异常.

解决方案:复制您的收藏.

context.Items.Where( i => i.Value > 50 ).ToList().ForEach(item => context.Items.Remove(item));
Run Code Online (Sandbox Code Playgroud)