'嵌套linq查询中的列名[ColumnName]'无效

时间:2011-03-08 23:37:42

标签: c# sql-server linq linqpad sqlexception

上次更新

经过大量测试后,我意识到如果我在SQL 2000和SQL 2005上的相同数据集(在本例中为Northwind)表上运行相同的查询,我会得到两个不同的结果。 在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

我已经解决了它与Timestamp的最后一个查询有关,因为这有效:

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()})

查询已简化。目的是按一组变量进行分组,然后显示该分组最后一次出现在db。

我正在使用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

1 个答案:

答案 0 :(得分:0)

您应该使用SQL事件探查器来检查针对2个数据库生成的SQL是否不同。

我们只有两个问题,即在SQL Server 2005上运行但在SQL Server 2000上没有运行。在这两种情况下,都是由于SQL Server 2000中缺少对多活动结果集(MARS)的支持。在一个案例中它导致锁定在数据库中,在另一种情况下导致性能下降。