我提出了一个相关问题:
嵌套 linq 查询中的“列名无效 [ColumnName]”
我正在尝试按照此处的要求获取组的第一行:
Linq - 每个组的最高值
但是,我使用 Max 的方法与接受的答案不同。我是这样做的:
ATable
.GroupBy (t => t.ID)
.Select ( t => t.OrderByDescending(x=>x.Timestamp).FirstOrDefault().Timestamp)
这会导致错误SqlException: Invalid column name 'ID'
现在当我使用 Max 函数时:
ATable
.GroupBy (t => t.ID)
.Select ( t => t.Max(x=>x.Timestamp))
它返回我想要的时间列表。
我的理解是它们是不同但等效的调用。为什么我在第一次调用时收到 sql 错误?
更新
为第一个查询生成的 sql 查询如下所示:
SELECT (
SELECT [t3].[Timestamp]
FROM (
SELECT TOP 1 [t2].[Timestamp]
FROM [ATable] AS [t2]
WHERE (([t1].[ID] IS NULL) AND ([t2].[ID] IS NULL)) OR (([t1].[ID] IS NOT NULL) AND ([t2].[ID] IS NOT NULL) AND ([t1].[ID] = [t2].[ID]))
ORDER BY [t2].[Timestamp] DESC
) AS [t3]
) AS [value]
FROM (
SELECT [t0].[ID]
FROM [ATable] AS [t0]
GROUP BY [t0].[ID]
) AS [t1]
我设法减少它但保持相同的错误:
SELECT (
SELECT [t3].[Timestamp]
FROM (
SELECT TOP 1 [Timestamp]
FROM [ATable]
WHERE [t1].[ID] = [ID]
) AS [t3]
) AS [value]
FROM (
SELECT [ID]
FROM [ATable]
GROUP BY [ID]
) AS [t1]
Update2
一些答案说这些查询在逻辑上是不同的,但是,如果你在北风表上做这样的事情,它会产生相同的结果:
OrderDetails
.GroupBy(x=>x.ProductID)
.Select(x=>x.OrderByDescending(y=>y.UnitPrice).FirstOrDefault().UnitPrice).Dump();
OrderDetails
.GroupBy(x=>x.ProductID)
.Select(x=>x.Max(y=>y.UnitPrice)).Dump();
因此,我不能接受 3 个答案中的任何一个,即查询不同,或者 Max 给出的是 Sum 而不是列表的最大值,或者您必须在继续之前将 IQueriable 转换为列表。