实体SQL:不支持子查询中的ORDER BY?

时间:2012-02-08 02:01:41

标签: entity-framework

举个例子,假设我使用Entity SQL(不是LINQ或T-SQL)来查询Northwind数据库。我想获取数据库中最近5个日期中所有订单的订单日期和公司名称。这在T-SQL中相当简单,但我很难解决如何在Entity SQL中完成它,我会很感激任何指针。

这是我的代码生成的查询:

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
WHERE [T_Orders].[OrderDate] IN 
    (SELECT VALUE DISTINCT [S_Orders].[OrderDate]
     FROM [NorthwindContext].[Orders] AS [S_Orders] 
     ORDER BY [S_Orders].[OrderDate] DESC LIMIT(5))
ORDER BY [T_Orders].[OrderDate] ASC SKIP(@skip) LIMIT(@limit)

这会给我带来以下错误:

  无法在当前范围或上下文中解析

'S_Orders.OrderDate'。确保所有引用的变量都在范围内,加载了所需的模式,并正确引用了名称空间。近成员访问表达式,第5行,第143列。

如果我取出子查询中的ORDER BY / LIMIT子句,我没有错误,我的查询返回表中的所有行。如果在子查询中将SELECT(5)添加到SELECT,那么我将获得最早的5个日期,但不是最近的5个日期。

任何人都可以告诉我我的Entity SQL语法中出了什么问题,或者建议使用Entity SQL获取我想要的结果的其他方法吗?

更新

感谢Thit Lwin Oo的建议,我能够找到以下查询,为我做了诀窍。

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
INNER JOIN
(
    SELECT [T_Orders].[OrderDate]
    FROM [NorthwindContext].[Orders] AS [T_Orders]
    GROUP BY [T_Orders].[OrderDate]
    ORDER BY [T_Orders].[OrderDate] DESC LIMIT(5)
) AS REC ON ([T_Orders].[OrderDate] = REC.[OrderDate])

2 个答案:

答案 0 :(得分:1)

我明白了。这个怎么样。

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
INNER JOIN
(
    SELECT TOP(5) MAX([T_Orders].[OrderDate]) AS [OrderDate]
    FROM [NorthwindContext].[Orders] AS [T_Orders]
    GROUP BY [T_Orders].[CustomerID]
) AS REC ON ([T_Orders].[OrderDate] = REC.[OrderDate])

答案 1 :(得分:0)

你可以尝试一下吗?

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
INNER JOIN
(
    SELECT TOP 5 [T_Orders].[CustomerID], MAX([T_Orders].[OrderDate]) [OrderDate]
    FROM [NorthwindContext].[Orders] AS [T_Orders]
    GROUP BY [T_Orders].[CustomerID]
) REC ON ([T_Customers].[CustomerID] = REC.[CustomerID] AND [T_Orders].[OrderDate] = REC.[OrderDate])