2011-05-14 2 views
0

IQueryable을받은 후 쿼리를 수정하여 정렬을 활성화 할 수 없습니다.. 다음은 코드 스 니펫입니다. IQueryable (IEnumerable과 반대로)에서 시도하고있는 것을 수행 할 수 있어야한다는 인상을 받고 있습니다.IQueryable and sorting

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 유형 일 경우에만 쿼리를 수정할 수 있다고 생각했습니다 (실수로 생각됩니다). –

+0

@ Rahul : 정확합니다. 그러나 그렇게 할 수는 있지만 추가 결과를 다른 변수에 저장해야합니다. 그냥'q.OrderBy (o => o.ShipCity) '를 호출하면 관찰 한대로 아무것도하지 않습니다. 결과를 어딘가에 저장하려면'var q2 = q.OrderBy (o => o.ShipCity)'를 수행해야합니다. – mellamokb

+1

@Rahul :'IEnumerable' 또는'IQueryable'에'LINQ' 메쏘드를 사용할 수 있습니다. 차이점은'IQueryable'은 지연 호출을 합쳐서 결과가 요청 될 때까지 실제로 평가하지 않는다는 것입니다. 그러나'IEnumerable'은 느린 평가 대신에 메모리 내 콜렉션에서 즉시'LINQ'를 수행합니다. LINQ-to-whatever를 사용할 때 최상의 성능을 위해 여러 쿼리 호출을 결합하려면 IQueryable을 사용해야합니다. – mellamokb