【发布时间】:2011-03-09 12:24:51
【问题描述】:
我提出了一个相关问题:
'Invalid column name [ColumnName]' on a nested linq query
我正在尝试按照此处的要求获得组的第一行:
Linq - Top value from each group
但是,我使用 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]
更新2
一些答案说这些查询在逻辑上是不同的,但是,如果你在北风表上做这样的事情,它会产生相同的结果:
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 转换为列表。
【问题讨论】:
-
你能以某种方式让我为第一个查询生成 SQL 查询吗?服务器日志应该有它们。
-
作为对所提供答案的回应,如果您点击第二个链接,则会提供(不接受)使用 OrderByDescending 但不链接 .Timestamp 或一般 .[FieldID] 的解决方案。这会返回第一行..但链接字段不起作用(即使使用 FirstOrDefault)。
-
如果它在没有链接
Timestamp的情况下工作,那么两个查询之间肯定有很大的区别。
标签: c# linq linqpad sqlexception