LINQ OrderBy Name ThenBy ChildrenCollection.Name - PullRequest
8 голосов
/ 20 августа 2009

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

17 голосов
/ 20 августа 2009

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

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 голосов
/ 20 августа 2009

Поскольку 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...