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

linq orderby name thenby childrencollection.name

  •  8
  • TehOne  · 技术社区  · 15 年前

    Linq中是否有任何方法可以执行orderby,然后使用父对象的子对象执行thenby和thenby的二级排序?

    _repository.GetActiveDepartmentGroupsWithDepartments().OrderBy(c => c.DepartmentGroupName).ThenBy(c => c.Departments.OrderBy(d => d.DepartmentName))
    

    在上面的案例中,c.部门是一个整体集合。

    btw:当我尝试上面的方法,然后对它执行tolist()时,我得到了这个错误:

    DbSortClause expressions must have a type that is order comparable.
    Parameter name: key
    

    提前感谢您的帮助或指导。

    2 回复  |  直到 15 年前
        1
  •  17
  •   dahlbyk    15 年前

    似乎您正在尝试获取按“组”和“部门名称”排序的所有部门的列表。如果是这样,那么您可能想这样做:

    var res = from c in _repository.GetActiveDepartmentGroupsWithDepartments()
              from d in c.Departments
              orderby c.DepartmentGroupName, d.DepartmentName
              select d;
    

    或在方法语法中:

    var res = _repository.GetActiveDepartmentGroupsWithDepartments()
                         .SelectMany(c => c.Departments, (c,d) => new { c, d })
                         .OrderBy(x => x.c.DepartmentGroupName)
                         .ThenBy(x => x.d.DepartmentName)
                         .Select(x => x.d);
    
        2
  •  2
  •   Alexandru    15 年前

    因为deparment是一个集合,所以必须将其转换为标量才能用于排序。

    一个选项是在集合中选择一个实体,例如第一个部门的名称:

    _repository.GetActiveDepartmentGroupsWithDepartments()
       .OrderBy(c => c.DepartmentGroupName)
       .ThenBy(c => c.Departments
           .OrderBy(d => d.DepartmentName)
           .FirstOrDefault()
           .DepartmentName
        )
    

    另一种选择是按集合本身的属性排序,例如部门数:

    _repository.GetActiveDepartmentGroupsWithDepartments()
       .OrderBy(c => c.DepartmentGroupName)
       .ThenBy(c => c.Departments.Count())