我正在使用EF 6和.NET Framework 4.6.1。我有一种情况,如果所有子记录都满足特定条件,则需要排除父记录。
这是我到目前为止所做的普通版本:
public ParentRecords GetParentRecordsExceptWhereSpecificStringOnAllChildren(string aSpecificString){
return ParentRecords
.Where(parent => !parent.ChildRecords
.Select(child => child.SomeStringProperty)
.All(c => c.Equals(aSpecificString))
);
}
这花费了太多时间(每条子记录一秒钟的时间),并且从EF生成的SQL包含n-1条UNION ALL
语句,其中n是子记录的数量。
我怀疑我缺少一种明显的写方法,可以显着提高性能,但是我没有看到它(但是我绝对不是LINQ / EF大师)。
我编写了一个存储过程,该过程返回相同的数据,但是返回的速度更快,而且布局也不完全相同(每个子记录对应一个平面行与一行)。但是,我们正在尝试避免使用存储过程,因此,我将回到研究如何使LINQ更快的基础。
任何建议将不胜感激。如果我没有清楚说明这一点,请告诉我。我试图将其设为通用,以防万一其他人处于这种情况下。
答案 0 :(得分:1)
您可以从代码中删除对SomeStringProperty的选择。
使用任何
ParentRecords.Where(parent =>
parent.ChildRecords.Any(child => !child.SomeStringProperty.Equals(aSpecificString)));
全部使用
ParentRecords.Where(parent =>
!parent.ChildRecords.All(child => child.SomeStringProperty.Equals(aSpecificString)));