Betrachten Sie die folgende vereinfachte Objekte und Beziehungen:Wie gruppieren mehrere Elemente mit GroupBy()?
public class Job{
int JobId;
String name;
String status;
Discipline disc;
WorkCategory workCat;
}
public class Discipline {
int DisciplineId;
String DisciplineName;
}
public class Workcategory{
int WorkCategoryId;
String WorkCategoryName;
}
public Class Grouping{
Discipline parent;
List<Workcategory> children;
}
oben genannten Modelle eine Beziehung, die a mit einem Job
Discipline
und ein WorkCategory
zugeordnet ist. Die Workcategory
ist immer ein Kind eines bestimmten Elternteils Discipline
(Eins-zu-viele-Beziehung). Wir können davon ausgehen, dass die Beziehung der zugewiesenen Disziplin und Workcategory immer gültig ist.
Das Problem, mit dem ich konfrontiert bin, ist, wenn ich versuche, ein Grouping
Ergebnisobjekt basierend auf Filtern zu erstellen, die auf Jobs
angewendet werden. Ich bin mir nicht sicher, ob dies möglich ist oder ob der Ansatz, den ich einstelle, sogar richtig ist. Die genaue Frage selbst ist mir nicht klar, jedoch definiert das Obige die Problemstellung.
- Kann das Design verbessert werden?
- Wie kann ich Jobs nach Disziplin und Workcategory gruppieren?
- Benötige ich sogar die Klasse
Grouping
?
Ich habe Folgendes versucht (dies ist mein erster Versuch mit Linq), aber zu keinem Erfolg, da mein Verständnis nicht vollständig genug ist. Die andere Alternative besteht darin, zuerst die Discipline
Gruppe zu erhalten und durch die ursprüngliche Gruppierung zu gehen, wobei die zugehörige Workcategory
abgerufen wird.
var grouping = repository.GetJobsWithActiveStatus()
.GroupBy(x => new {
x.Discipline.DisciplineID,
x.Discipline.DisciplineName,
x.Category.WorkCategoryID,
x.Category.WorkCategoryName
})
.Select(g => new Grouping{
Discipline = new Discipline{
DisciplineID = g.Key.DisciplineID,
Name = g.Key.DisciplineName
},
Categories = ?? // this is where I am lost
}});
Edit: Danach gebucht hat, wird mir klar, dass die inital GroupBy-Parameter in einer Gruppe von Punkt führen, während ich für die Gruppe-SubGroup Ergebnis suchen.
Edit 2: Um ein wenig weiter zu klären, ich will nicht die zugehörigen Jobs als Teil des Ergebnisses, sondern die Disziplin-Workcategory Gruppierung - also den Grund für die Grouping
Klasse
Initial Lösung auf Basis von @Obalix
Edit 7-Mar-2010:
Diese Lösung funktioniert nicht - Die GroupBy für das Objekt Discipline ergibt eine eindeutige Gruppierung für jedes Objekt. Ich denke, das liegt daran, dass es ein Referenztyp ist. Hab ich recht? Ich akzeptierte dies zunächst als Antwort, aber nach einigen Kopfkratzern erkannte ich, dass meine gefälschten Daten selbst fehlerhaft waren. Die ersten Fragen bleiben weiterhin beantwortet.
Ich habe mir den Link angesehen und das Lesen der Kommentare hat mich zu einem anderen Beitrag geführt, also schauen wir uns das weiter an. Ich bin jedoch auf der Suche nach einem stark typisierten Ergebnis (Gruppierung) – Ahmad
Dann ersetzen Sie einfach die 'neue {}' durch 'neue StrongType {}'. Wenn Sie "Key", "Count" und "WorkCategoryGroups" verwenden, verwenden Sie Ihre benutzerdefinierten Mitglieder. Der erweiterte Ansatz, der durch den Link beschrieben wird, ist stark typisiert. – AxelEckenberger
FYI - die in der oben genannten Antwort geschrieben ist großartig - es gibt eine Follow-up-Post in Bezug auf Dynamic GroupByMany auch wenn jemand interessiert ist http://blogs.msdn.com/mitsu/archive/2008/02/07/linq -groupbymany-dynamically.aspx – Ahmad