我有一个实体框架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
不支持该方法。
那么......我怎样才能删除我需要的所有记录?
答案 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在移除之前不会加载每个项目,因为这是接受的答案中的一个案例。