2012-05-22 62 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