比LINQ中的“不是全部”优化/更快的选择

时间:2019-05-30 13:41:02

标签: c# performance entity-framework linq

我正在使用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更快的基础。

任何建议将不胜感激。如果我没有清楚说明这一点,请告诉我。我试图将其设为通用,以防万一其他人处于这种情况下。

1 个答案:

答案 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)));