2012-03-20 64 views
20

我目前訂購使用IQueryable的排序依據的方法如下自定義對象的列表的IQueryable順序:由兩個或多個屬性

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

現在,我希望通過多個屬性進行排序。有沒有辦法做到這一點?

感謝, 雅尼斯

回答

38
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()返回排序的枚舉,並且它不會對inset中已存在的List進行排序。在你的例子中,你沒有將排序列表保存到變量中。

+0

儘管如此。 PropertyName實際上是一個String(導致它從一個排序選擇器中進來)。所以我不能使用這個。任何替代品? – Yannis 2012-03-21 08:14:55

+0

在OrderBy和ThenBy中,您必須提供keySelector函數,該函數從對象中選擇用於排序的鍵。使用字符串屬性名稱可以使用反射來創建此類函數:var propertyInfo = i.GetType()。GetProperty(「PropertyName」); myList.OrderBy(i => propertyInfo.GetValue(i,null))''但它會變慢,然後直接訪問屬性。你也可以用Expressiosn動態地「編譯」這樣的功能,並且它的運行速度比表達式要快,但它不是很容易。或者你可以在WPF中使用CollectionViewSource及其排序功能 – Nikolay 2012-03-21 08:52:36

+0

@Nikolay - 爲什麼不使用動態Linq呢? – 2012-03-21 10:37:32

10

你可以使用.ThenBy

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

這就是事情。 PropertyName實際上是一個String(導致它從一個排序選擇器中進來)。所以我不能使用這個。任何替代品? – Yannis 2012-03-20 17:02:51

5

你可能想使用ThenBy擴展方法能夠通過多個字段進行排序

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

如果您想要動態的Linq,看看LinqKit。我最近從here實施了Microsoft的動態Linq庫,並能夠使用字符串對兩個字段進行排序。

太棒了!不知道這是否會在.NET 5中。

+0

儘管如此。 PropertyName實際上是一個String(導致它從一個排序選擇器中進來)。所以我不能使用這個。任何替代品? – Yannis 2012-03-21 08:20:26

+0

@Yannis - 使用動態Linq – 2012-03-21 09:36:08