7

我在 Web 服务中有一个方法,该方法具有参数,用户可以使用该参数来决定他们希望如何对结果进行排序。这是一个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    
4

1 回答 1

7

您可以编写自己的扩展方法OrderByOrThenBy来检查值是否已经IOrderedQueryable,如果是,则使用ThenByOrderBy否则。有点臭,但做起来并不难。

编辑:C# 示例(未经测试):

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);
    }
}
于 2012-05-11T13:08:28.867 回答