Laden...

Entity Framework Core: Sortieren anhand Property auf Child-Relation

Erstellt von mchrd vor 4 Jahren Letzter Beitrag vor 4 Jahren 871 Views
M
mchrd Themenstarter:in
17 Beiträge seit 2018
vor 4 Jahren
Entity Framework Core: Sortieren anhand Property auf Child-Relation

Hallo zusammen,

ich würde gerne eine Abfrage (m zu n Beziehung) mittels Entity Framework Core tätigen und das Ergebnis gerne nach einer Entität sortieren lassen welche ich mittels Include einbeziehe.

Im Bild seht ihr eine Beispielhafte Beziehung.

Mittels

var erg = _db.Gebäude.Include(x => x.GebäudeHatRäume).ThenInclude(x => x.Raum).ToList()

könnte ich jetzt eine Abfrage erstellen. Allerdings möchte ich, dass die Liste nach den Namen der Räume sortiert wird.

Wenn ich das .OrderBy(x => x....) verwende kann ich nur nach der ID oder dem Namen der Gebäude sortieren lassen.

Über Tipps wäre ich dankbar.

2.078 Beiträge seit 2012
vor 4 Jahren

GebäudeHatRäume ist im Model eine Liste, oder?
Wie willst Du anhand eines Items von einer Liste sortieren? Du musst dir also ein Item suchen, das Du dann zum Sortieren nutzen möchtest, z.B. indem Du das erste Item aus der Liste nutzt.
Probier da Mal herum und schau, was EFCore noch alles übersetzen kann.

Aber achtung: Kann EFCore deinen Code nicht nach SQL übersetzen, erfärst Du das nur als Warnung im Log, sofern vorhanden.
Das kannst Du aber umstellen, wenn Du die DbContextOptions erstellst:

var options = new DbContextOptionsBuilder<YourDbContext>() // Muss nicht zwingend generisch sein
    .ConfigureWarnings(warnings => 
    {
        warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
    }
    .Options;

Dann kriegst Du eine Exception anstatt eines Log-Eintrags.
Ich persönlich würde das so lange wie möglich drin lassen, damit man möglichst viele solcher Situationen findet. Für den produktiven Betrieb (release-Build oder per Config einstellbar) kann man das dann ja wieder heraus nehmen, es könnte zwar die Performance verschlechtern, aber der Nutzer diese unverständlichen Fehler nicht mehr.