在 LINQ 中表现出色 SQL

Having performance in LINQ to SQL

在 LINQ to SQL 中将 where 放在 group by 之后,就像 T-SQL 中的 having 一样工作。我希望 LINQ 在结果中生成 having 语句。但是当我查看输出语句时,我没有看到任何 having 语句。是否有任何方法或技巧可以强制 LINQ 使用 having 并获得更好的性能?

LINQ 查询:

var result = from item in db.Words
             group item by item.UserID into gp
             where gp.Average(g => g.DownVotes) == 0
             select gp.Key;

result.ToList();

SQL 输出:

-- Region Parameters
DECLARE @p0 Float = 0
-- EndRegion
SELECT [t1].[UserID]
FROM (
    SELECT AVG([t0].[DownVotes]) AS [value], [t0].[UserID]
    FROM [Words] AS [t0]
    GROUP BY [t0].[UserID]
    ) AS [t1]
WHERE [t1].[value] = @p0

我认为此查询的性能低于 having

这些查询在功能上是相同的,所发生的只是 LINQ 使用子查询来提供查询的内层。

考虑到在正常的组查询中,您需要 HAVING 作为分组后的第二个 WHERE 子句,但在子查询版本中,WHERE 无论如何在组之后运行。

正如 MarcinJuraszek 所说,对两个查询进行基准测试以获得更快的答案,否则就相信 T-SQL 引擎无论如何都会优化子查询版本。