如何从实体框架集合中删除项目的子集

时间:2011-10-18 20:21:50

标签: c# entity-framework

我有一个实体框架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不支持该方法。

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

3 个答案:

答案 0 :(得分:12)

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

// 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列表中删除该项时,它不会影响我正在迭代的列表。

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

在EF6之前,有一种RemoveRange方法可以获得更好的性能和更清晰的API

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

order.Requirements.RemoveRange(deleteQuery);

现在,EF在移除之前不会加载每个项目,因为这是接受的答案中的一个案例。