gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:56:45 29 4
gpt4 key购买 nike

我在 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

最佳答案

您可以编写自己的扩展方法 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);
}
}

关于vb.net - 在循环中添加多个 OrderBy 语句的 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10551925/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com