У меня есть метод в веб-службе, у которого есть параметр, с помощью которого пользователи могут решить, как они хотят упорядочить свои результаты. Это List(Of String)
с именами полей в том порядке, в котором они хотят их отсортировать.
Я знаю, что обычно могу упорядочить несколько столбцов, выполнив следующие действия
Dim test = Bars.OrderBy(Function(x) x.Foo) _
.ThenBy(Function(x) x.Bar) _
.ThenBy(Function(x) x.Test)
Однако в данном случае это не сработает, так как я не могу связать функцию ThenBy
, потому что я добавляю сортировку заказы в цикле. Чтобы использовать ThenBy
, мне нужна коллекция IOrderedQueryable
. Вот как я хотел бы, чтобы это работало
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
Это, конечно, не будет работать, потому что OrderBy
заменит любой предыдущий порядок. Единственное решение, которое я могу придумать, это сначала упорядочить список по какой-то другой переменной, поэтому у меня уже есть коллекция IOrderedQueryable
, но это кажется неправильным подходом.
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