c# - 优化/比 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 更快的问题上。
任何建议将不胜感激。如果我没有解释清楚,请告诉我。为了重复使用,我试图使其通用,以防其他人处于这种情况。
解决方案
您可以从代码中删除对 SomeStringProperty 的选择。
使用任何
ParentRecords.Where(parent =>
parent.ChildRecords.Any(child => !child.SomeStringProperty.Equals(aSpecificString)));
全部使用
ParentRecords.Where(parent =>
!parent.ChildRecords.All(child => child.SomeStringProperty.Equals(aSpecificString)));
推荐阅读
- javascript - chrome devtools 在调试时不再显示内联变量
- ios - 未找到 Unity iOS 项目“FBSDKShareKit/FBSDKShareKit.h”文件
- c# - C#在windows窗体内运行外部exe
- mysql - 尝试进行 LEFT JOIN,但结果为空
- oracle - 使用oracle程序读取和存储目录中的所有文件
- c# - 首先从控制器获取数据,然后如何将其发回?asp.net核心mvc
- php - 从数据库中添加产品页面列表类别
- visual-studio - 是否可以在 Visual Studio 或其他 IDE 中进行设置?
- php - 用于检测 rar 文件完成 (*.r01) 的 PHP 函数不适用于 *.s01
- timer - Arduino Mega 2560 定时器中断