【问题标题】:How to remove a subset of items from an Entity Framework Collection如何从实体框架集合中删除项目的子集
【发布时间】:2018-10-31 20:42:58
【问题描述】:

我有一个实体框架EntityCollection

我需要从数据库中删除与给定 where 子句匹配的所有项目。这是我现有的代码:

// Perform the deletes
foreach (var deleteReq in order.Requirements.Where(x=>!orderContract.Requirements.Any(y=>y.RequirementId==x.RequirementId)))
{
    order.Requirements.Remove(deleteReq);
}

基本上,我试图从 order.Requirements 集合中删除不在 orderContract.Requirements 集合中的任何内容(与 Id 匹配)。

正如您可能猜到的,这段代码抛出异常是因为我正在修改我正在迭代的集合。

通常我只会使用RemoveAll(),但EntityCollection 不支持该方法。

那么...我怎样才能删除我需要的所有记录?

【问题讨论】:

  • 为什么不能在列表中收集可移动项目?集合大小很大?

标签: c# entity-framework


【解决方案1】:

我创建了一个单独的列表,它似乎有效:

// Perform the deletes
var reqsToDelete = order.Requirements.Where(x=>!orderContract.Requirements.Any(y=>y.RequirementId==x.RequirementId)).ToList();
foreach (var deleteReq in reqsToDelete)
{
    order.Requirements.Remove(deleteReq);
}

这样,当我从 order.Requirements 列表中删除项目时,它不会影响我正在迭代的列表。

【讨论】:

    【解决方案2】:

    将您要删除的所有需求实体收集到一个列表中。

    然后从Requirements 实体集合而不是order.Requirements 中删除每一个。

    【讨论】:

    • 唉,在我正在删除的位置,很难获得需求实体集合。 (我在 AutoMapper ITypeConverter 中。)
    • 至少,你将无法在foreach循环中删除,尝试将它收集到一个列表中。然后在循环之外尝试手动删除它。
    【解决方案3】:

    在 EF6 之前,有一个 RemoveRange 方法可以提供更好的性能和更简洁的 API

    var deleteQuery = order
        .Requirements
        .Where(x=> !orderContract.Requirements.Any(y=>y.RequirementId == x.RequirementId));
    
    order.Requirements.RemoveRange(deleteQuery);
    

    现在,EF 不会在删除之前加载每个项目,因为这是已接受答案中的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      相关资源
      最近更新 更多