我有一个Task对象的ObservableCollection。每个任务都具有以下属性:
我正在为用户提供一个界面来选择他们要按哪个字段排序。在某些情况下,用户可能希望按最多三个属性进行排序。如何动态构建一个LINQ语句,允许我按升序或降序对所选字段进行排序?
目前,我正在尝试以下方法,但它似乎只按应用的最后一种排序进行排序:
var sortedTasks = from task in tasks
select task;
if (userWantsToSortByAssignedTo == true)
{
if (sortByAssignedToDescending == true)
sortedTasks = sortedTasks.OrderByDescending(t => t.AssignedTo);
else
sortedTasks = sortedTasks.OrderBy(t => t.AssignedTo);
}
if (userWantsToSortByCategory == true)
{
if (sortByCategoryDescending == true)
sortedTasks = sortedTasks.OrderByDescending(t => t.Category);
else
sortedTasks = sortedTasks.OrderBy(t => t.Category);
}
是否有一种优雅的方法可以动态地将订单子句附加到LINQ语句中?
答案 0 :(得分:3)
您可以使用ThenBy
代替OrderBy
来应用多个订单。你需要一个OrderBy(x => 1)
来开始这个过程。
var sortedTasks = from task in tasks
orderby 1
select task;
if (userWantsToSortByAssignedTo)
{
if (sortByAssignedToDescending)
sortedTasks = sortedTasks.ThenByDescending(t => t.AssignedTo);
else
sortedTasks = sortedTasks.ThenBy(t => t.AssignedTo);
}
if (userWantsToSortByCategory)
{
if (sortByCategoryDescending)
sortedTasks = sortedTasks.ThenByDescending(t => t.Category);
else
sortedTasks = sortedTasks.ThenBy(t => t.Category);
}
答案 1 :(得分:1)
您可以使用以下
sortedTasks = sortedTasks.OrderBy(t => t.AssignedTo).ThenBy(t => t.Category);