【问题标题】:How can I sort a list based on a user's selections in ASP.NET MVC?如何根据用户在 ASP.NET MVC 中的选择对列表进行排序?
【发布时间】:2012-02-08 07:22:29
【问题描述】:

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

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();

【问题讨论】:

    标签: asp.net-mvc linq dynamic-linq


    【解决方案1】:

    查看http://tomasp.net/articles/dynamic-linq-queries.aspx 获取有关如何在运行时构建动态 LinQ 查询的教程。这应该是您正在寻找的。​​p>

    【讨论】:

    • 谢谢,克里斯。我去看看。
    • 我通读了 Tomas 的帖子。我还在动态 linq 上查看了 Scott Guthrie's post(从 2008 年开始)。我不喜欢这两条路似乎都死了。 Tomas 有一个指向他的 CodePlex 项目的链接,该项目在 2007 年处于 alpha 阶段,此后一直没有被触及。幸运的是,链接可变数量的 .OrderBy 的解决方案对我有用。
    【解决方案2】:

    我通过在 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)}
    

    【讨论】:

      猜你喜欢
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2011-01-03
      • 2019-05-11
      相关资源
      最近更新 更多