IQueryable порядок по двум или более свойств - PullRequest
26 голосов
/ 20 марта 2012

В настоящее время я упорядочиваю список пользовательских объектов с помощью метода IQueryable OrderBy следующим образом:

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

Теперь я ищу сортировку по нескольким свойствам. Есть ли способ сделать это?

Спасибо, Яннис

Ответы [ 3 ]

51 голосов
/ 20 марта 2012
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, и она будет работать быстрее, чем отражение, но это не очень легко.Или вы можете использовать CollectionViewSource и их возможности сортировки в WPF.

И не забывайте, что OrderBy () возвращает отсортированный перечислимый, и он не сортирует ваш существующий список на месте.В вашем примере вы не сохранили отсортированный список в переменную.

13 голосов
/ 20 марта 2012

Вы можете использовать .ThenBy:

var result = mylist
    .AsQueryable()
    .OrderBy(x => x.PropertyName)
    .ThenBy(x => x.SomeOtherProperty);
6 голосов
/ 20 марта 2012

Возможно, вы захотите использовать метод расширения ThenBy, чтобы иметь возможность сортировки по нескольким полям

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

Если вы хотите динамический Linq, посмотрите на LinqKit . Недавно я реализовал динамическую библиотеку Microsoft Linq из здесь и смог отсортировать по двум полям, используя строку.

Потрясающие вещи! Не уверен, будет ли это в .NET 5 или нет.

...