'Неверное имя столбца [ColumnName]' во вложенном запросе linq - PullRequest
4 голосов
/ 09 марта 2011

Последнее обновление

После многих испытаний я понял, что, если я выполняю один и тот же запрос по одной и той же таблице набора данных (в данном случае 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

1 Ответ

0 голосов
/ 14 марта 2012

Вы должны использовать профилировщик SQL, чтобы проверить, отличается ли SQL, сгенерированный для двух баз данных.

У нас было только две проблемы, когда что-то выполнялось на SQL Server 2005, но не на SQL Server 2000. В обоих случаях это было связано с отсутствием поддержки множественных активных наборов результатов (MARS) в SQL Server 2000. В одном случае это привело к блокировке базы данных, в другом случае - к снижению производительности.

...