Silverlight - C#和LINQ - 按多个字段排序

时间:2010-03-14 19:23:34

标签: c# linq

我有一个Task对象的ObservableCollection。每个任务都具有以下属性:

  • AssignedTo
  • 分类
  • 标题
  • AssignedDate

我正在为用户提供一个界面来选择他们要按哪个字段排序。在某些情况下,用户可能希望按最多三个属性进行排序。如何动态构建一个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语句中?

2 个答案:

答案 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);