ネストされた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();
したがって、クエリが異なる、Max がリストの最大値ではなく Sum を指定している、または先に進む前に IQueriable をリストに変換する必要があるという 3 つの回答のいずれも受け入れることができません。