Запрос Linq с несколькими операторами OrderBy, добавленными в цикле

У меня есть метод в веб-службе, у которого есть параметр, с помощью которого пользователи могут решить, как они хотят упорядочить свои результаты. Это 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    
7
задан Xharze 11 May 2012 в 13:23
поделиться