我有一个简单的实体框架查询。 它使用分组:
source.GroupBy(x => x.Key)
.Select(x => x.Count(z => z.IsDefaultValue == false) > 0
? x.FirstOrDefault(z => z.IsDefaultValue == false)
: x.FirstOrDefault()
);
它的执行计划如下:
然后我更改了查询:
source.GroupBy(x => x.Key)
.Select(x => x.Any(z => z.IsDefaultValue == false)
? x.FirstOrDefault(z => z.IsDefaultValue == false)
: x.FirstOrDefault()
);
现在我使用任意而不是计数。 它的计划如下:
我的问题是:我应该使用什么查询? 什么查询更有效?
我对执行计划一无所知:( 您在这些执行计划中看到了哪些重要信息?
编辑:请在新标签页中拖动图片,它会更具可读性。
答案 0 :(得分:1)
我的问题是:我应该使用什么查询?什么查询更有效?
要找到答案,我只需要生成两个已生成的SQL查询(您可以在计划的xml中查看完整查询)并在一个SQL Server Management Studio查询窗口中一起运行它们, “包括实际执行计划”选项。
结果计划中的“查询成本(相对于批次)”将告诉您哪一个对您的实际架构/数据更有效。
EF的Any()vs Count()> 0?哪个更有效率?
一般情况下,如果你只想知道任何的“东西”是否符合你的标准,那么通常建议你使用Any()而不是Count()> 0让LINQ担心构建最有效的方法。在这个用例中,我只需检查SQL并查看。
查看this
等答案仅针对
IEnumerable<T>
,Any()
通常会更快,因为它只需要查看一次迭代。