LINQ OrderBy Name ThenBy ChildrenCollection.Name

c# entity-framework linq linq-to-entities

Question

Existe-t-il un moyen dans LINQ d'effectuer un OrderBy, puis un ThenBy avec le ThenBy en utilisant les enfants de l'objet parent pour effectuer le classement secondaire?

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

Dans le cas ci-dessus, c.Departments est un EntityCollection.

BTW: Lorsque j'essaie ce qui précède et que je fais ensuite une ToList () dessus, j'obtiens cette erreur:

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

Merci d'avance pour toute aide ou conseils.

Réponse acceptée

On dirait que vous essayez d’obtenir une liste de tous les départements classés par groupe, puis par nom de département. Si oui, alors vous voudrez probablement faire quelque chose comme ceci:

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

Ou en syntaxe de méthode:

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

Réponse populaire

Puisque Deparment est une collection, vous devez le transformer en scalaire pour pouvoir l'utiliser pour le tri.

Une option consiste à sélectionner une seule entité dans la collection, par exemple le nom du premier département:

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

Une autre option est de commander par une propriété de la collection elle-même, par exemple le nombre de départements:

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


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow