在循环中添加了多个OrderBy语句的Linq查询

xqk2d5yq  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(130)

我在一个webservice中有一个方法,它有一个参数,用户可以用它来决定他们想要如何对结果进行排序。这是一个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

1hdlvixo

1hdlvixo1#

你可以编写自己的扩展方法OrderByOrThenBy,它检查值是否 * 已经 * 是IOrderedQueryable,如果是,则使用ThenBy,否则使用OrderBy。有点臭,但不是很难做。
编辑: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);
    }
}

字符串

roqulrg3

roqulrg32#

public static IOrderedQueryable<T> OrderByOrThenBy<T, TKey>
        (this IQueryable<T> source,
        Expression<Func<T, TKey>> ordering)
    {
        if (source == null)
        {
            throw new ArgumentNullException("source");
        }
        if (ordering == null)
        {
            throw new ArgumentNullException("ordering");
        }
        var ordered = source as IOrderedQueryable<T>;

        var test = source.Expression.Print().Split(".OrderBy"); ;

        if (test.Length < 3)
        {
            return source.OrderBy(ordering);
        }
        else
        {
            return ordered.ThenBy(ordering);
        }
    }

字符串

相关问题