我提出了一个相关的问题有关:
'Invalid column name [ColumnName]' on a nested linq query最大(X => x.Time)VS OrderByDescending(X => x.Time)。首先()时间
我试图让高层在这里问的一组行如下:
Linq - Top value from each group
但是,我接近它不同于接受的答案使用最大。我就是这么做的:
ATable
.GroupBy (t => t.ID)
.Select (t => t.OrderByDescending(x=>x.Timestamp).FirstOrDefault().Timestamp)
这将导致错误SqlException: Invalid column name 'ID'
现在,当我使用最多的功能:
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个答案是说,查询是不同的,或者最多是给点心代替的列表的最大值,或者在继续之前必须将IQueriable转换为列表。
你能以某种方式让我为第一个查询生成的SQL查询吗? serverlogs应该有他们。 – Femaref 2011-03-09 02:17:27
作为对所提供答案的回应,如果您遵循第二个链接,则会提供使用OrderByDescending但不链接.Timestamp或一般链接的解决方案(不接受)。[FieldID]。这将回馈第一行..但链接领域不工作(即使与FirstOrDefault)。 – Joe 2011-03-09 02:18:57
如果它没有链接'时间戳',那么两个查询之间必定有一个主要区别。 – Femaref 2011-03-09 02:20:44