2012-05-22 128 views
14

可能重複:
Dynamic LINQ OrderBy避免開關的情況下-linq

switch (sort) { 
       case "Title": 
        queryResults = queryResults.OrderBy(r => r.Title); 
        break; 
       default: 
        queryResults = queryResults.OrderBy(r => r.LastName); 
        break; 

有沒有什麼辦法可以擺脫上面的開關塊的?

我可以做一些事情,如:

queryResults = queryResults.OrderBy(r => r."sort"); 
or 
queryResults = queryResults.OrderBy(r => r.sort); 
+0

你會發現在這個問題的答案:http://stackoverflow.com/questions/41244/dynamic-linq -orderby –

+0

提供的解決方案不適用於大多數linq提供程序,請參閱我的解決方案:http://stackoverflow.com/a/21936366/775114 –

回答

8

如果你想這樣做完全動態的,你可以使用一些反射(簡單的例子):

string prop = "Title"; 
var q = queryResults.OrderBy(x => x.GetType().GetProperty(prop).GetValue(x, null)); 

我不會考慮這個無論如何,這是最好的解決方案。這對你來說是否真的有意義取決於你從哪裏獲得屬性名稱(如果你從反射中獲取它,也可以不),以及有多少屬性。

5

這應該這樣做

queryResults = queryResults.OrderBy(r => sort == "Title" ? r.Title : r.LastName) 
4

你可以使用DynamcLinq。一年多來我沒有碰過它,但我有預期的結果。您的代碼將改變爲:

queryResults = queryResults.OrderBy(sort);

那太酷了,這也是一個NuGet package too