首页 > 解决方案 > 优化/比 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-1UNION ALL条语句,其中 n 是子记录的数量。

我怀疑我错过了一种明显的方法来编写可以显着提高性能的方法,但我没有看到它(但无论如何我都不是 LINQ/EF 大师)。

我编写了一个存储过程,它返回相同的数据,但速度更快,并且布局不完全相同(一个扁平行与每个子记录的一行)。不过,我们正试图避免存储过程,所以我回到了研究如何使这个 LINQ 更快的问题上。

任何建议将不胜感激。如果我没有解释清楚,请告诉我。为了重复使用,我试图使其通用,以防其他人处于这种情况。

标签: c#performanceentity-frameworklinq

解决方案


您可以从代码中删除对 SomeStringProperty 的选择。

使用任何

        ParentRecords.Where(parent =>
            parent.ChildRecords.Any(child => !child.SomeStringProperty.Equals(aSpecificString)));

全部使用

       ParentRecords.Where(parent =>
            !parent.ChildRecords.All(child => child.SomeStringProperty.Equals(aSpecificString)));

推荐阅读