我在一个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
型
2条答案
按热度按时间1hdlvixo1#
你可以编写自己的扩展方法
OrderByOrThenBy
,它检查值是否 * 已经 * 是IOrderedQueryable
,如果是,则使用ThenBy
,否则使用OrderBy
。有点臭,但不是很难做。编辑:C#样本(未测试):
字符串
roqulrg32#
字符串