0

我有一个简单的实体框架查询。它使用分组:

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()
);

现在我使用Any而不是Count。它的计划是这样的: 计划 2

我的问题是:我应该使用什么查询?什么查询更有效?

我对执行计划一无所知:(您在这些执行计划中看到了哪些重要信息?

编辑:请将图片拖到新标签中,它会更具可读性。

4

1 回答 1

1

我的问题是:我应该使用什么查询?什么查询更有效?

为了找到这个问题的答案,我将简单地获取已生成的两个 SQL 查询(您可以在计划的 xml 中查看完整的查询)并在一个 SQL Server Management Studio 查询窗口中一起运行它们,并使用“包括实际执行计划”选项。

然后,生成的计划中的“查询成本(相对于批次)”将告诉您哪个对您的实际架构/数据更有效。

EF 的 Any() vs Count() > 0 怎么样?哪个更有效率?

一般来说,如果您只想知道任何“事物”是否符合您的标准,那么通常建议您使用 Any() 而不是 Count() > 0 并让 LINQ 担心构建最有效的方法。在这个用例中,我只需检查 SQL 并查看。

看到这样的答案

对于 just IEnumerable<T>, then通常Any()会更快,因为它只需要查看一次迭代。

于 2012-08-01T13:05:31.583 回答