如何根据用户在ASP.NET MVC中的选择对列表进行排序?

Jon*_*ell 5 linq asp.net-mvc dynamic-linq

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

customers = customers
                .OrderBy(c => c.LastName)
                .ThenBy(c => c.City)
                .ThenBy(c => c.Age).ToList();
Run Code Online (Sandbox Code Playgroud)

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

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

    customers = customers
                .OrderBy(c => c.sortField1)
                .ThenBy(c => c.sortField2)
                .ThenBy(c => c.sortField3).ToList();
Run Code Online (Sandbox Code Playgroud)

Jon*_*ell 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();
        }
Run Code Online (Sandbox Code Playgroud)

结果查询:

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