两个或更多属性的IQueryable订单

我目前正在使用IQueryable OrderBy方法订购自定义对象列表,如下所示:

mylist.AsQueryable().OrderBy("PropertyName"); 

现在我希望按不止一个属性进行排序。 有没有办法做到这一点?

谢谢,雅尼斯

 OrderBy(i => i.PropertyName).ThenBy(i => i.AnotherProperty) 

在OrderBy和ThenBy中,你必须提供keySelector函数,它选择从对象中排序的键。 因此,如果您只在运行时知道属性名称,那么您可以使用reflection来创建这样的函数:

 var propertyInfo = i.GetType().GetProperty("PropertyName"); var sortedList = myList.OrderBy(i => propertyInfo.GetValue(i, null)) 

但它会慢,然后直接进入财产。 你也可以使用Linq.Expressions“动态”编译这样的函数,它比reflection更快,但不是很容易。 或者您可以在WPF中使用CollectionViewSource及其排序function。

并且不要忘记OrderBy()返回已排序的枚举,并且它不会对现有的List进行排序。 在您的示例中,您没有将排序列表保存到变量。

你可以使用.ThenBy

 var result = mylist .AsQueryable() .OrderBy(x => x.PropertyName) .ThenBy(x => x.SomeOtherProperty); 

您可能希望使用ThenBy扩展方法能够按多个字段排序

  return myList.AsQueryable().OrderBy(m=>m.Property1).ThenBy(m => m.Property2); 

如果你想要动态Linq,请看LinqKit 。 我最近从这里实现了Microsoft的动态Linq库,并且能够使用字符串对两个字段进行排序。

太棒了! 不确定这是否在.NET 5中。