2010-11-22 2 views
2

Zuerst hatten Thomas Levesque eine gute Lösung für die Bestellung von Feldern in einer verknüpften Tabelle in dem die Beziehung nicht immer da sein kann:Entity Framework 4 und Linq: SortiertNach ein Feld in einer Abfrage verschachtelt: Refactoring meinen Code

userQuery = userQuery.OrderBy(u => 
    (u.Department != null) ? u.Department.Name : String.Empty); 

Ich muss das Gleiche tun. Meine Gesamtwurzel ist enorm:

Ist dies wirklich die Art, dies zu tun, oder gibt es etwas viel einfacher zu lesen? Mein anderes Problem ist, dass das verschachtelte myField einen übereinstimmenden "Standard" -Wert hat, der in der Query der obersten Ebene sitzt, die auch von myField benannt wird. Die Idee war, durch das Zusammenwachsen dieser beiden Felder zu ordnen (??).

Edit: Ich denke, das würde den „Standardwert“ aus dem ersten Feld ist:

myQuery = myQuery.OrderBy(p => 
    (p.Seconds == null 
    ? p.myDefaultField // Used to be zero 
    : p.Seconds.FirstOrDefault() == null 
     ? p.myDefaultField 
     : p.Seconds.First().Thirds == null 
     ? p.myDefaultField 
     : p.Seconds.First().Thirds.FirstOrDefault() == null 
      ? p.myDefaultField 
      : p.Seconds.First().Thirds.First().Forths == null 
      ? p.myDefaultField 
      : p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null 
       ? p.myDefaultField 
       : p.Seconds.First().Thirds.First().Forths.First().myField)); 

Wie konnte ich diese SortiertNach umschreiben sauberer zu sein? Dieser Code schlägt mit einem Fehler von "Kann Elemente des Typs 'System.Collections.Generic.IEnumerable`1' nicht vergleichen. Nur primitive Typen (wie Int32, String und Guid) und Entitätstypen werden unterstützt."

+2

Nun, vielleicht sollten Sie dieses Problem versuchen, irgendwo anders zu lösen. Sind Sie sicher, dass Sie durch vier Beziehungen navigieren müssen? Können Sie die Datenbank und/oder Mappings nicht ändern, damit Sie die Daten in einem passenderen Format erhalten? –

+0

Ich kann immer eine Ansicht und/oder gespeicherte Prozedur hinzufügen, aber das Endergebnis ist ein hierarchisches JSON-Objekt, das zum Client geht. Also würde ich am Ende eine Hierarchie von einem abgeflachten Objekt neu erstellen. –

Antwort

2

Ich denke, Sie haben hier einen ziemlich bösen Code-Geruch, aber mit dem zu arbeiten, was Sie haben, würde ich das in einer solchen LINQ-Abfrage nicht behandeln. Nur aus Gründen der Lesbarkeit ich so etwas wie

tun würde
myQuery = myQuery.OrderBy(p => 
    (p.HasValidFields() 
    ? p.Seconds.First().Thirds.First().Forths.First().myField 
    : p.myDefaultField 
)); 

Und innerhalb von p Klasse

private bool HasValidFields 
{ 
    get 
    { 
    return p.Seconds != null && 
      p.Seconds.FirstOrDefault() != null && 
      .... ; 
    } 
} 
Verwandte Themen