最後の更新
多くのテストを行った後、SQL 2000 と SQL 2005 で同じデータセット (この場合は Northwind) テーブルに対して同じクエリを実行すると、2 つの異なる結果が得られることに気付きました。SQL 2000 では、問題のエラーが発生します。SQL 2005 では成功します。
そのため、linqpad によって生成されたクエリは sql 2000 では機能しないと結論付けました。これを再現するには、次のコマンドを実行します。
OrderDetails
.GroupBy(x=>x.ProductID)
.Select(x=>new {product_id = x.Key, max_quantity = x.OrderByDescending(y=>y.UnitPrice).FirstOrDefault().Quantity}).Dump();
SQL 2000 の Northwind DB で。SQL 変換は次のとおりです。
SELECT [t1].[ProductID] AS [product_id], (
SELECT [t3].[Quantity]
FROM (
SELECT TOP 1 [t2].[Quantity]
FROM [OrderDetails] AS [t2]
WHERE [t1].[ProductID] = [t2].[ProductID]
ORDER BY [t2].[UnitPrice] DESC
) AS [t3]
) AS [max_quantity]
FROM (
SELECT [t0].[ProductID]
FROM [OrderDetails] AS [t0]
GROUP BY [t0].[ProductID]
) AS [t1]
元の質問
次のクエリがあります。
ATable
.GroupBy(x=> new {FieldA = x.FieldAID, FieldB = x.FieldBID, FieldC = x.FieldCID})
.Select(x=>new {FieldA = x.Key.FieldA, ..., last_seen = x.OrderByDescending(y=>y.Timestamp).FirstOrDefault().Timestamp})
結果:
SqlException: Invalid column name 'FieldAID' x 5
SqlException: Invalid column name 'FieldBID' x 5
SqlException: Invalid column name 'FieldCID' x 1
これが機能するため、タイムスタンプへの最後のクエリと関係があることがわかりました。
ATable
.GroupBy(x=> new {FieldA = x.FieldAID, FieldB = x.FieldBID, FieldC = x.FieldCID})
.Select(x=>new {FieldA = x.Key.FieldA, ..., last_seen = x.OrderByDescending(y=>y.Timestamp).FirstOrDefault()})
クエリは簡略化されています。目的は、一連の変数でグループ化し、このグループ化がデータベースで最後に発生した時間を表示することです。
これらの結果を生成するためにLinqpad 4を使用しているため、Timestampは文字列を提供しますが、FirstOrDefaultは理想的ではないオブジェクト全体を提供します。
更新
さらにテストしたところ、SQLException の数とタイプが groupby 句で作成されたクラスに関連していることがわかりました。そう、
ATable
.GroupBy(x=> new {FieldA = x.FieldAID})
.Select(x=>new {FieldA = x.Key.FieldA, last_seen = x.OrderByDescending(y=>y.Timestamp).FirstOrDefault()})
結果は
SqlException: Invalid column name 'FieldAID' x 5