Последнее обновление
После многих испытаний я понял, что, если я выполняю один и тот же запрос по одной и той же таблице набора данных (в данном случае Northwind) в SQL 2000 и SQL 2005, я получаю два разных результата.
На 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();
на базе данных Northwind в SQL 2000. Перевод 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 для генерации этих результатов, поэтому метка времени дает мне строку, тогда как 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