两个或更多属性的IQueryable订单

时间:2012-03-20 13:00:10

标签: c# linq sorting c#-4.0 iqueryable

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

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

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

谢谢, 雅尼斯

4 个答案:

答案 0 :(得分:50)

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

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

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

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

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

答案 1 :(得分:13)

您可以使用.ThenBy

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

答案 2 :(得分:6)

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

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

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

很棒的东西!不确定这是否在.NET 5中。

答案 3 :(得分:0)

正如其他人所建议的那样,您可以使用“ ThenBy”。如果您想在使用前将字符串转换为其他值,也可以这样做,例如...

    var sortedSystemTestResultsList = systemTestResultsList.OrderBy(s =>
    {
        DateTime dt;
        if (!DateTime.TryParse(s.testPointCompletedDate, out dt)) return DateTime.MaxValue;
        return dt;
    }).ThenBy(s =>
    {
        Int32 tpID;
        if (!Int32.TryParse(s.testRunResultID, out tpID)) return Int32.MaxValue;
        return tpID;
    });