【问题标题】:LINQ OrderBy Name ThenBy ChildrenCollection.NameLINQ OrderBy Name ThenBy ChildrenCollection.Name
【发布时间】:2009-08-20 07:37:00
【问题描述】:

在 LINQ 中是否有任何方法可以使用父对象的子对象来执行 OrderBy,然后使用 ThenBy 执行 ThenBy 进行二级排序?

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

在上述情况下,c.Departments 是一个 EntityCollection。

顺便说一句:当我尝试上述方法然后对其执行 ToList() 时,我收到此错误:

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

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

【问题讨论】:

    标签: c# linq entity-framework linq-to-entities


    【解决方案1】:

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

    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】:

      由于 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())
      

      【讨论】:

        猜你喜欢
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 2018-09-16
        • 2021-04-17
        • 1970-01-01
        相关资源
        最近更新 更多