LINQ OrderBy Name ThenBy ChildrenCollection.Name

Есть ли способ в 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

Заранее спасибо за любую помощь или руководство.

2 ответа

Решение

Похоже, вы пытаетесь получить список всех отделов, упорядоченных по группам, а затем название отдела. Если так, то вы, вероятно, хотите сделать что-то вроде этого:

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

Поскольку 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())
Другие вопросы по тегам