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