我正在调查LINQ被映射到SQL的方式,我遇到了一些麻烦。
有一个表sessions
,每个用户登录一行。请考虑以下SQL
SELECT COUNT(*) AS c
FROM sessions
GROUP BY sessions.user_id
ORDER BY c DESC
我正在使用LINQPad来测试LINQ-to-SQL转换。
海峡前进
from s in Sessions group s by s.User_id into logins
orderby logins.Count() descending
select new { c = logins.Count() }
给了我
SELECT [t1].[value2] AS [c]
FROM (
SELECT COUNT(*) AS [value], COUNT(*) AS [value2]
FROM [sessions] AS [t0]
GROUP BY [t0].[user_id]
) AS [t1]
ORDER BY [t1].[value] DESC
修改后的
(from s in Sessions group s by s.User_id into logins
select new { c = logins.Count() }).OrderByDescending(v => v.c)
被映射到
SELECT [t1].[value2] AS [c]
FROM (
SELECT COUNT(*) AS [value], COUNT(*) AS [value2]
FROM [sessions] AS [t0]
GROUP BY [t0].[user_id]
) AS [t1]
ORDER BY [t1].[value] DESC
我无法获得这种最佳输出。有办法吗?
或者,也许,我不应该担心SQL会得到优化吗?
答案 0 :(得分:0)
该查询存在“无”错误,如果您担心的话,它不会对行进行两次COUNT。
答案 1 :(得分:0)
或者,也许,我不应该担心SQL会得到优化吗?
比较“最佳”sql和生成的sql的执行计划。 (Sql Studio - 点击“显示估计执行计划”)
通过检查和绘制我多年来点击该按钮 - 生成的子查询根本没有任何问题。
即使这个查询也应该没问题(意思是:不需要额外的费用)
SELECT [t1].[value2] AS [c]
FROM (
SELECT COUNT(*) AS [value], COUNT(*) AS [value2]
FROM [sessions] AS [t0]
GROUP BY [t0].[user_id]
) AS [t1]
ORDER BY [t1].[value] DESC