2011-05-14 106 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