代码之家  ›  专栏  ›  技术社区  ›  user70192

Silverlight-C和Linq-按多个字段排序

  •  2
  • user70192  · 技术社区  · 14 年前

    我有一个可以观察到的任务对象集合。每个任务都具有以下属性:

    • 受让人
    • 书名
    • 受让日期

    我将为用户提供一个界面,以选择要按哪些字段排序。在某些情况下,用户可能希望最多按这些属性中的三个进行排序。如何动态地构建一个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);    
    }
    

    有没有一种优雅的方式来动态地将ORDER子句附加到LINQ语句中?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Mark Byers    14 年前

    你可以用 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);
    }
    
        2
  •  1
  •   bristows    14 年前

    你能用一下吗

    sortedTasks = sortedTasks.OrderBy(t => t.AssignedTo).ThenBy(t => t.Category);