2012-01-11 64 views
5

我有一个客户列表,可以根据用户的选择在1到6个字段之间进行排序。排序字段可以按任何顺序排列。如果我提前知道字段和序列,排序很容易:如何根据用户在ASP.NET MVC中的选择对列表进行排序?

customers = customers 
       .OrderBy(c => c.LastName) 
       .ThenBy(c => c.City) 
       .ThenBy(c => c.Age).ToList(); 

如何在运行时传递排序字段?有没有办法做这样的事情?

string sortField1 = "State"; 
    string sortField2 = "City"; 
    string sortField3 = "Type"; 

    customers = customers 
       .OrderBy(c => c.sortField1) 
       .ThenBy(c => c.sortField2) 
       .ThenBy(c => c.sortField3).ToList(); 

回答

1

我通过在ForEach循环中链接.OrderBy语句解决了这个问题。 .OrderBy会附加到我的Linq查询中,以供用户选择的每个排序条件。通过将我的列表包装在IQueryable中,我可以在构建Linq查询时看到它。

IQueryable<CustomerMaster> query = customers.AsQueryable(); 

      // reverse the sort order (sorts are applied incrementally) 
      // We need the user's last 
      // sort criteria to get applied first 
      sortOrder.Reverse(); 

      foreach (var sortItem in sortOrder) 
      { 
       switch (sortItem) 
       { 
        case "LName": 
         query = query.OrderBy(c => c.LName); 
         break; 

        case "State": 
         query = query.OrderBy(c => c.State); 
         break; 

        default: 
         query = query 
          .OrderBy(c => c.LName) 
          .ThenBy(c => c.State); 
         break; 
       } 
      } 
      customers = query.ToList(); 
      // set the sortorder back to user's order 
      sortOrder.Reverse(); 
     } 

结果查询:

query = {System.Collections.Generic 
     .List`1[CustomerMaster] 
     .OrderBy(c => c.LName) 
     .OrderBy(c => c.State)} 
1

看一看http://tomasp.net/articles/dynamic-linq-queries.aspx关于如何在运行时创建动态LINQ查询的教程。这应该是你正在寻找的。

+0

谢谢,Chrisi。我会看一看。 – 2012-01-11 23:31:57

+2

我通过Tomas的帖子阅读。我也看了[斯科特格思里的帖子](http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library。 aspx)(从2008年开始)动态LINQ。我不喜欢这两条小径似乎都死了。 Tomas与他的CodePlex项目有一个联系,那就是2007年的alpha版本,此后一直没有被触及。幸运的是,链接可变数量的.OrderBy的解决方案为我工作。 – 2012-01-12 19:58:33

相关问题