2010-12-15 7 views
6

Ich habe eine Sammlung von Mitarbeitern, und jeder Mitarbeiter hat eine Sammlung von Verantwortlichkeiten. Ich möchte eine nach Namen sortierte Liste der Mitarbeiter ausgeben und ihre Verantwortlichkeiten nach Titel sortiert ausgeben.Wie Sie eine Sammlung und ihre Untersammlung mit LINQ bestellen?

So sollte es wie folgt ausgegeben werden:


Jane Jones

Aufgaben:

Verantwortung A

Verantwortung B

Mike Smith

Aufgaben:

Verantwortung A

Verantwortung C


die erste Sammlung Um die ich benutze:

var employees = _context.Employees.OrderBy(e => e.Name); 

aber ich kann nicht scheinen, um herauszufinden, wie auf Bestellung die Subskollektion Zuständigkeiten.

Ich benutze MVC und meine Ansicht empfängt eine stark typisierte Employee-Sammlung, so dass ich keinen anonymen Typ erstellen und zurückgeben möchte.

+0

Ich habe beschlossen, nicht die colelction zu bestellen, wenn ich es aus der Datenbank ziehen. Technisch bestellen ist Teil der Präsentation, also mache ich es jetzt in der Ansicht (ich benutze MVC). Ich bestelle jetzt die Sub-Sammlung, wenn ich einen foreach über Mitarbeiter mache. Verantwortlichkeiten. –

+0

Wäre schön zu wissen, wie dies für zukünftige Referenz getan wird. Vielen Dank! –

+0

Ich habe den zweiten Ansatz hinzugefügt .. Sorry, es ist auch ziemlich schwer. Ich glaube nicht, dass es einen einfacheren Weg gibt, also stimme ich Ihnen zu - es wäre viel besser, in der Ansicht zu ordern oder ein spezielles DTO (Data Transfer Object) zu erstellen und eine Projektion darin durchzuführen und dann zur Ansicht zu gelangen anstelle des Angestellten. –

Antwort

2

1. Ansatz: (ist für LINQ to Objects mit Aufgaben nur geeignet als IList definiert)

Sie in eine neue Sammlung von Mitarbeitern kopieren könnte, aber dies bedeutet, dass Sie jedes Feld erneut zu kopieren brauchen in neue Mitarbeiter, etwa so:

var employees = from e in _context.Employees 
       orderby e.Name 
       select new Employee 
       { 
        Name = e.Name, 
        ...re-assign other properties... 
        Responsibilities = e.Responsibilities.OrderBy(r => r.Name).ToList() 
       }; 

2. Ansatz:

Verwendung der DataLoadOptions. Grundsätzlich erstellen Sie ein Dataload Objekt, das angibt, wie eine besondere Beziehung bestellen, also in Ihrem Fall:

var options = new DataLoadOptions(); 
options.AssociateWith<Employees>(e => e.Responsibilities.OrderBy(r => r.Name)); 
_context.LoadOptions = options; 

var employees = _context.Employees.OrderBy(e => e.Name); 

Die Aufgaben werden automatisch bestellt werden.

+0

Ich denke auch, es ist eine Verschwendung, jedes Feld zu rekopieren. In Wirklichkeit bekomme ich einen Fehler, wenn ich ein Objekt von IQueryable nicht auf EntityCollection anwenden kann. Das funktioniert also nicht für mich. –

+0

yeah, es muss in EntitySet vs. List konvertiert werden. Außerdem können Sie keinen neuen Employee in der Query erstellen. B/c L2S lässt das nicht zu, so dass es scheint, dass nur die zweite Option in Ihrem Szenario verwendet werden kann. –

3

Man könnte so etwas wie tun:

var employees = _context.Employees.OrderBy(e => e.Name); 
employees.ToList().ForEach(e => e.Responsibilities = e.Responsibilities.OrderBy(r => r.Name)); 
+0

Wenn ich dies versuche, erhalte ich den Fehler: Kann den Quellentyp IOrderedEnumerable <> nicht zum Zieltyp EntityCollection <> konvertieren. –

+0

Arbeitete für mich. Ich bin mir nicht sicher, ob es der beste Weg für meinen speziellen Fall ist, aber jetzt bleibe ich dran. – Jeroen

+0

Für jemanden, der den Fehler 'Kann den Quellentyp IOrderedEnumerable <> in den Zieltyp EntityCollection <>' konvertieren kann. Sie würden es einfach in Liste viz konvertieren. 'employees.ToList(). ForEach (e => e.Responsibilities = e.Responsibilities.OrderBy (r => r.Name) .ToList());' –

Verwandte Themen