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
"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) –