2012-01-11 35 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

相關問題