Fre*_*man 7 linq vb.net sql-order-by
我在Web服务中有一个方法,该方法具有参数,用户可以使用该参数来决定他们如何订购结果.这是一个List(Of String)带有要按其排序顺序的字段名称.
我知道我通常可以通过执行以下操作在多个列上进行排序
Dim test = Bars.OrderBy(Function(x) x.Foo) _
.ThenBy(Function(x) x.Bar) _
.ThenBy(Function(x) x.Test)
Run Code Online (Sandbox Code Playgroud)
但是在这种情况下这不起作用,因为我无法链接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
Run Code Online (Sandbox Code Playgroud)
这当然不会起作用,因为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
Run Code Online (Sandbox Code Playgroud)
您可以编写自己的扩展方法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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3054 次 |
| 最近记录: |