2012-05-11 42 views
7

Tôi có một phương thức trong một dịch vụ web có tham số mà người dùng có thể quyết định cách họ muốn đặt hàng kết quả của họ. Đây là một số List(Of String) với tên của các trường theo thứ tự mà chúng muốn sắp xếp chúng.Truy vấn LINQ với nhiều câu lệnh OrderBy được thêm vào trong vòng lặp

Tôi biết tôi thường có thể đặt hàng trên nhiều cột bằng cách làm như sau

Dim test = Bars.OrderBy(Function(x) x.Foo) _ 
       .ThenBy(Function(x) x.Bar) _ 
       .ThenBy(Function(x) x.Test) 

Tuy nhiên trong trường hợp này này sẽ không làm việc kể từ khi tôi không thể chuỗi các ThenBy chức năng vì tôi thêm lệnh sắp xếp trong một vòng lặp. Để sử dụng ThenBy Tôi cần một bộ sưu tập IOrderedQueryable. Đây là cách tôi muốn nó hoạt động

Dim sortColumns = {"Foo", "Bar", "Test"} 
Dim query = From b in Bars 
For each column in sortColumns 
    Select Case column 
     Case "Foo" 
      query = query.Orderby(Function(x) x.Foo) 
     Case "Bar" 
      query = query.Orderby(Function(x) x.Bar) 
     Case "Test" 
      query = query.Orderby(Function(x) x.Test) 
    End Select 
Next 

Dim result = query.Select(Function(x) x.x).ToList() 
Return result 

Điều này tất nhiên sẽ không làm việc vì OrderBy sẽ thay thế bất kỳ đặt hàng trước. Giải pháp duy nhất tôi có thể nghĩ đến là sắp xếp danh sách trên một số biến khác đầu tiên vì vậy tôi đã có một bộ sưu tập IOrderedQueryable nhưng điều này có vẻ giống như cách tiếp cận sai.

Dim bars As New List(Of Bar) 
Dim sortColumns = {"Foo", "Bar", "Test"} 
Dim query = bars.Select(Function(x) New With {.Temp = 1, .x = x}) _ 
       .OrderBy(Function(x) x.Temp) 

For Each column In sortColumns 
    Select Case column 
     Case "Foo" 
      query = query.ThenBy(Function(x) x.x.Foo) 
     Case "Bar" 
      query = query.ThenBy(Function(x) x.x.Bar) 
     Case "Test" 
      query = query.ThenBy(Function(x) x.x.Test) 
    End Select 
Next 

Dim result = query.Select(Function(x) x.x).ToList() 
Return result  
+0

"OrderBy sẽ thay thế bất kỳ đặt hàng trước". Không đúng. OrderBy bảo tồn các thứ tự trước ... có nghĩa là: nó là một thứ tự ổn định. Cũng có nghĩa là: nó sử dụng thứ tự trước để phá vỡ các mối quan hệ trong thứ tự hiện tại. Vì vậy: OrderBy (Foo) .ThenBy (Bar) .ThenBy (Test) giống như OrderBy (Test) .OrderBy (Bar) .OrderBy (Foo) –

Trả lời

7

Bạn có thể viết phương pháp khuyến nông của riêng bạn OrderByOrThenBy đó kiểm tra xem giá trị là đã một IOrderedQueryable, sử dụng ThenBy nếu như vậy và OrderBy khác. Hơi hôi, nhưng không khó khăn lắm.

EDIT: mẫu C# (chưa được kiểm tra):

public static class QueryableOrdering 
{ 
    public static IOrderedQueryable<TElement> OrderByOrThenBy<TElement, TKey> 
     (this IQueryable<TElement> source, 
     Expression<Func<TElement, TKey>> ordering) 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException("source"); 
     } 
     if (ordering == null) 
     { 
      throw new ArgumentNullException("ordering"); 
     } 
     var ordered = source as IOrderedQueryable<TElement>; 
     return ordered == null ? source.OrderBy(ordering) 
           : ordered.ThenBy(ordering); 
    } 
} 
+0

Mẫu C# sẽ ổn, tôi có thể tự chuyển đổi. –

+0

@FreekBuurman: Đã hoàn toàn chưa được kiểm tra, nhưng hãy xem chỉnh sửa của tôi ... –

+0

Điều đó trông giống như một giải pháp tốt đẹp, cảm ơn! –

Các vấn đề liên quan