【发布时间】:2013-01-20 06:50:16
【问题描述】:
我正在努力尝试在正确的 T-SQL 函数中生成此 LINQ 函数。
请检查以下句子:
// determine the max count of exams applied by students
IQueryable query = (from at in Database.Current.AnsweredTests
where at.TestId == id
group at by at.StudentId into s
select s.Count()).Max();
正如你所见,这个函数在语法上是错误的,因为Max 扩展返回int。所以我想要完成的是生成一个正确的 T-SQL。
类似这样的:
MAX(SELECT x.COUNT()
FROM...
GROUP BY StudentId)
我这样做只是因为我想要一个好的性能,而这就是性能低下。所以我的问题是如何使用 MAX 和 COUNT 等聚合函数编写正确的 LINQ 语句。
更新:
SELECT [GroupBy1].[A1] AS [C1]
FROM ( SELECT
[Extent1].[StudentId] AS [K1],
COUNT(1) AS [A1]
FROM [dbo].[AnsweredTests] AS [Extent1]
WHERE CAST( [Extent1].[TestId] AS int) = @p__linq__0
GROUP BY [Extent1].[StudentId]
) AS [GroupBy1]
这就是生成 IQueryable 的原因(当然,如果我删除了最大扩展名)。我想知道是否有办法在该 T-SQL 查询中包含聚合函数 MAX 以提高服务器端的性能。
【问题讨论】:
-
您的 IQueryable 生成的 SQL 是什么?
-
@DarfZon 你确定你想要的 SQL 是正确的吗?
-
@lazyberezovsky 当然,我错过了什么吗?
-
旁注,但
CAST看起来像一个丑陋的索引阻塞问题。不确定这是一个无法控制的工件,还是您在某处存在类型不匹配。
标签: c# linq entity-framework entity-framework-4