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)
我通过在 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)
| 归档时间: |
|
| 查看次数: |
698 次 |
| 最近记录: |