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

前端之家收集整理的这篇文章主要介绍了vb.net – 在循环中添加多个OrderBy语句的Linq查询前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Web服务中有一个方法,该方法具有参数,用户可以使用该参数来决定他们如何订购结果.这是一个List(Of String),其中包含要按其排序顺序的字段名称.

我知道我通常可以通过执行以下操作在多个列上进行排序

  1. Dim test = Bars.OrderBy(Function(x) x.Foo) _
  2. .ThenBy(Function(x) x.Bar) _
  3. .ThenBy(Function(x) x.Test)

但是在这种情况下这不起作用,因为我无法链接ThenBy函数,因为我在循环中添加排序顺序.要使用ThenBy,我需要一个IOrderedQueryable集合.这就是我希望它的工作方式

  1. Dim sortColumns = {"Foo","Bar","Test"}
  2. Dim query = From b in Bars
  3. For each column in sortColumns
  4. Select Case column
  5. Case "Foo"
  6. query = query.Orderby(Function(x) x.Foo)
  7. Case "Bar"
  8. query = query.Orderby(Function(x) x.Bar)
  9. Case "Test"
  10. query = query.Orderby(Function(x) x.Test)
  11. End Select
  12. Next
  13.  
  14. Dim result = query.Select(Function(x) x.x).ToList()
  15. Return result

这当然不会起作用,因为OrderBy将取代之前的任何订购.我能想到的唯一解决方案是首先在其他变量上排序列表,这样我就已经有了一个IOrderedQueryable集合,但这看起来似乎是错误方法.

  1. Dim bars As New List(Of Bar)
  2. Dim sortColumns = {"Foo","Test"}
  3. Dim query = bars.Select(Function(x) New With {.Temp = 1,.x = x}) _
  4. .OrderBy(Function(x) x.Temp)
  5.  
  6. For Each column In sortColumns
  7. Select Case column
  8. Case "Foo"
  9. query = query.ThenBy(Function(x) x.x.Foo)
  10. Case "Bar"
  11. query = query.ThenBy(Function(x) x.x.Bar)
  12. Case "Test"
  13. query = query.ThenBy(Function(x) x.x.Test)
  14. End Select
  15. Next
  16.  
  17. Dim result = query.Select(Function(x) x.x).ToList()
  18. Return result
您可以编写自己的扩展方法OrderByOrThenBy,它检查该值是否已经是IOrderedQueryable,如果是,则使用ThenBy,否则使用OrderBy.有点臭,但不是很难做.

编辑:C#样本(未经测试):

  1. public static class QueryableOrdering
  2. {
  3. public static IOrderedQueryable<TElement> OrderByOrThenBy<TElement,TKey>
  4. (this IQueryable<TElement> source,Expression<Func<TElement,TKey>> ordering)
  5. {
  6. if (source == null)
  7. {
  8. throw new ArgumentNullException("source");
  9. }
  10. if (ordering == null)
  11. {
  12. throw new ArgumentNullException("ordering");
  13. }
  14. var ordered = source as IOrderedQueryable<TElement>;
  15. return ordered == null ? source.OrderBy(ordering)
  16. : ordered.ThenBy(ordering);
  17. }
  18. }

猜你在找的VB相关文章