用于LINQ的SQL等效扩展方法并不明显

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于LINQ的SQL等效扩展方法并不明显相关的知识,希望对你有一定的参考价值。

我正在使用LINQ to entity framework(EF)来使用下面的代码来获取表中的记录数:

 using (var db = new StackOverflowEntities())
 {
      var empLevelCount = db.employeeLevels.Count();
 }

我使用SQL Server Profiler捕获了EF向数据库发出的查询。我得到以下查询:

SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[employeeLevels] AS [Extent1]
    )  AS [GroupBy1]

即使对于LongCount扩展方法,此查询仍然完全相同,除了在EF创建的SQL查询中COUNT SQL函数被COUNT_BIG替换的事实。 LINQ到EF提供程序创建的查询对我来说非常奇怪。为什么它不是简单地执行类似下面的操作来返回标量计数值?

SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[employeeLevels] AS [Extent1]

如果有人可以帮助我了解EF内部正在处理的额外物流,那么LINQ to EF提供商正在创建这样的查询,这将会非常有用吗?似乎EF试图通过一些常见的算法来处理一些额外的用例,这会产生某种通用查询,就像上面创建的一样。

答案

在我的数据库中测试两个查询(适当地更改表)会发现它们都生成完全相同的查询计划。所以,结构不应过多关注你。在SQL中,您告诉系统您想要什么,并确定如何最好地执行此操作,并且优化器在此处可以生成给定样本的最佳计划。

enter image description here

至于为什么LINQ会生成这样的代码,我怀疑它只是代码生成器中的一种通用模式,它允许它为任何聚合和后续转换生成类似的代码,而不仅仅是未经过滤的计数。

以上是关于用于LINQ的SQL等效扩展方法并不明显的主要内容,如果未能解决你的问题,请参考以下文章

等效于链式 LINQ 扩展方法调用中的 'let' 关键字的代码

用于 XML 文件持久性的 LINQ to SQL 等效项

linq 等效于通用函数的'select *' sql?

Lambda 表达式 LINQ 等效于 SQL 在同一表/变量上存在查询

Linq 中的 IsNumeric 等效项

LINQ 和 SQL 中看似等效的查询返回不同的结果 [重复]