2011-05-14 75 views
0

这似乎是在收到IQueryable后,我无法修改查询以启用排序。这是代码片段。 我的印象是,与IQueryable(而不是IEnumerable)我应该能够做我正在尝试。IQueryable和排序

using (oc1 = new NWEntities()) 
{ 
    string customerid = "ALFKI"; 
    var q = GetOrders((o) => o.CustomerID == customerid); 

    q.OrderBy(o => o.ShipCity); // DOES NOT WORK !!!!!!!! 
    foreach (var x in q) 
    { 
     Console.WriteLine(string.Format("Order#:{0} City:{1} for Customer {2}", 
            x.OrderID, 
            x.ShipCity, 
            customerid)); 
    } 
} 

// Returns IQueryable 
IQueryable<Order> GetOrders(Expression<Func<Order, Boolean>> predicate) 
{    
    return (oc1.Orders.Where(predicate));    
} 

输出按某种方式不按城市排序。我错过了明显的东西吗? 谢谢你的时间。

回答

4

您需要将OrderBy的结果存储在另一个变量中。您对列表进行了排序,然后默默放弃了结果,并对原件进行了迭代:

var q = GetOrders(...); 

// notice I store in **q2** 
var q2 = q.OrderBy(o => o.ShipCity); 
foreach (var x in q2) 
+0

感谢您的回复。我认为可以继续构建linq查询变量,它会继续添加到表达式树,直到您实际执行查询为止(通过执行.ToList(),foreach()等)。此外,无论我是否返回IEnumerable或IQueryable,代码都可以工作。再次,我认为(错误地认为)如果它是IQueryable类型的,那么只能修改查询。 – 2011-05-14 17:04:52

+0

@Rahul:你说的没错。您可以这样做,但是,您必须将每个附加结果存储在另一个变量中。只要调用“q.OrderBy(o => o.ShipCity)”就不会有任何问题,正如你观察到的那样。你需要做'var q2 = q.OrderBy(o => o.ShipCity)'来存储结果。 – mellamokb 2011-05-14 17:08:16

+1

@Rahul:你可以在'IEnumerable'或'IQueryable'上使用'LINQ'方法。不同之处在于'IQueryable'将懒惰地结合这些调用,直到请求结果时才进行实际评估。然而'IEnumerable'会立即在内存集合上执行'LINQ',而不是懒惰的评估。使用LINQ-to-whatever时,应该使用IQueryable来组合多个查询调用以获得最佳性能。 – mellamokb 2011-05-14 17:09:53