我正在使用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试图通过一些常见的算法来处理一些额外的用例,这会产生某种通用查询,就像上面创建的一样。