Marc Gravell的Dynamic OrderBy可以在一个案例中使用,但不能在其他案例中使用

时间:2012-03-26 09:15:24

标签: c# linq entity-framework

我正在尝试使用Marc Gravell的代码对列进行动态排序。我发布了2个查询。它适用于一种情况,但在第二种情况下不起作用。任何人都能告诉我需要做些什么改变才能使两个查询完美运行?

这是 Marc Gravell 答案的链接:

https://stackoverflow.com/a/233505

我正在使用Northwind数据库。这些都是我的疑问:

 var query = (from cust in northwindEntities.Customers
              select new 
              {
                  City = cust.City ,
                  Orders = northwindEntities.Orders
                       .Where(o => o.CustomerID == cust.CustomerID)
                       .OrderBy("OrderID")
              }); // doesn't work.

 var query = (from cust in northwindEntities.Customers
              select new 
              {
                  City = cust.City ,
                  //Orders = northwindEntities.Orders.Where(o => o.CustomerID == cust.CustomerID).
                  // OrderBy("OrderID")
              }).OrderBy("City"); // works

以下是第一个查询的例外:

  

LINQ to Entities无法识别该方法   “System.Linq.IOrderedQueryable 1[ConsoleApplication12.Order] OrderBy[Order](System.Linq.IQueryable 1 [ConsoleApplication12.Order]   System.String)'方法,这个方法无法翻译成   商店表达。

2 个答案:

答案 0 :(得分:0)

您需要订购最终结果集,就像在第二情况下一样。在第一种情况下,您只订购northwindEntities.Orders.Where(结果,最终结果。

正确的查询是第二个。

答案 1 :(得分:0)

显然,由于与

相同的原因,它不会起作用
var query = (from cust in northwindEntities.Customers
          select new 
          {
              City = cust.City ,
              Orders = northwindEntities.Orders
                   .MyCustomMethod()
          });

不起作用。 LINQ-to-Entities将遍历此表达式树并尝试将其转换为SQL。它可以在已知的子方法集上工作,以转换为SQL。

但在第二个查询中,自定义OrderBy方法动态创建LINQ-to-Entities知道的OrderBy