2014-03-28 30 views
1

我有一个C#MVC项目。我想在客户端应用程序控制器方法中构建语句以从web.api中获取JSON,以便在视图模板中进行分页/排序。排序顺序是否可以作为变量传递给此代码?用于排序顺序的lambda - 可以使用变量吗?

var container = new CourseService.Container(uri); 
var query = container.Courses.OrderByDescending(c => c.Name).Skip(skip).Take(take).ToList(); 
+0

不,你不能,你需要做的是这样的:[http://stackoverflow.com/questions/3078465/want-a-query-to-使阶由可变式-LINQ查询] [1] [1]:http://stackoverflow.com/questions/3078465/want-a-query-to-make-order -by-variable-in-linq-query –

+0

谢谢Chris。这么想......但想要检查 – Steve

回答

1

为什么不添加自己的IEnumerable扩展做到这一点?

public enum SortOrder 
{ 
    Ascending, 
    Descending 
} 

public static class EnumerableExtensions 
{ 
    public static IEnumerable<T> OrderBy<T, TKey>(this IEnumerable<T> input, 
     Func<T, TKey> keySelector, SortOrder order) 
    { 
     switch(order) 
     { 
      case SortOrder.Descending: 
       return input.OrderByDescending(keySelector); 
      default: 
       return input.OrderBy(keySelector); 
     } 
    } 
} 

然后:

var output = container.Courses.OrderBy(c => c.Name, SortOrder.Descending); 
+0

蚂蚁感谢您的代码。我是C#新手。我的控制器方法和变量参数在下面的代码中。我如何实现你的代码?公共类HomeController:控制器 public ViewResult Index(string sortOrder) { – Steve

+0

如果您将'EnumerableExtensions'类和'SortOrder'枚举到代码库的某处,那么您可以像上面演示的那样调用它。如果你想使用字符串,你可以调整这个方法来取代一个字符串而不是'SortOrder',但是由于你失去了编译时检查(即你必须确保你每次都得到正确的字符串),这种方法不够健壮。更好的办法是改变你的控制器动作,使它看起来像:'public ViewResult Index(SortOrder sortOrder)'。 –

相关问题