加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

vb.net – 在循环中添加多个OrderBy语句的Linq查询

发布时间:2020-12-17 00:22:58 所属栏目:大数据 来源:网络整理
导读:我在Web服务中有一个方法,该方法具有参数,用户可以使用该参数来决定他们如何订购结果.这是一个List(Of String),其中包含要按其排序顺序的字段名称. 我知道我通常可以通过执行以下操作在多个列上进行排序 Dim test = Bars.OrderBy(Function(x) x.Foo) _ .Then
我在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","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
您可以编写自己的扩展方法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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读