LINQ-OrderBy-Name ThenBy-ChildrenCollection.Name

c# entity-framework linq linq-to-entities

Frage

Gibt es in LINQ eine Möglichkeit, ein OrderBy auszuführen und dann ein ThenBy mit ThenBy auszuführen, wobei die untergeordneten Elemente des übergeordneten Objekts verwendet werden, um die sekundäre Reihenfolge auszuführen?

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

Im obigen Fall ist c.Departments eine EntityCollection.

BTW: Wenn ich das oben ausprobiere und dann eine ToList () mache, erhalte ich diesen Fehler:

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

Vielen Dank im Voraus für jegliche Hilfe oder Anleitung.

Akzeptierte Antwort

Es scheint, als würden Sie versuchen, eine Liste aller Abteilungen nach Gruppen und Abteilungsnamen zu erhalten. Wenn ja, dann möchten Sie wahrscheinlich so etwas tun:

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

Oder in Methodensyntax:

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

Beliebte Antwort

Da es sich bei Deparment um eine Sammlung handelt, müssen Sie sie in einen Skalar umwandeln, um sie zum Sortieren zu verwenden.

Eine Möglichkeit besteht darin, eine einzelne Entität in der Sammlung auszuwählen, z. B. den Namen der ersten Abteilung:

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

Eine weitere Option ist die Bestellung einer Eigenschaft der Sammlung selbst, z. B. der Anzahl der Abteilungen:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum