considerare i seguenti oggetti e relazioni semplificate:Come raggruppare più elementi usando 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;
}
I modelli sopra un rapporto che un Job
è associato con un Discipline
e uno WorkCategory
. Il Workcategory
è sempre un figlio di un genitore specifico Discipline
(relazione uno-a-molti). Possiamo supporre che la relazione tra la Disciplina e la categoria di lavoro assegnate sarà sempre valida.
Il problema che sto affrontando è quando sto cercando di creare un oggetto risultato Grouping
in base ai filtri applicati a Jobs
. Non sono sicuro che questo possa essere fatto o se l'approccio che sto prendendo sia anche corretto. L'esatta domanda in sé non mi è chiara, tuttavia quanto sopra definisce la dichiarazione del problema.
- Il design può essere migliorato?
- Come posso raggruppare i lavori in base a Disciplina e Workcategory?
- Ho anche bisogno della classe
Grouping
?
Ho provato quanto segue (questo è il mio primo tentativo di usare Linq), ma senza successo in quanto la mia comprensione non è abbastanza completa. L'altra alternativa è quella di ottenere prima il gruppo Discipline
e il ciclo attraverso il raggruppamento originale raccogliendo il relativo Workcategory
.
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: Dopo aver postato questo, mi sono reso conto che i parametri GroupBy inital risultato in un gruppo di voce mentre io sono alla ricerca di risultato del Gruppo-sottogruppo.
Edit 2: Per chiarire un po 'più, non voglio il processi associati come parte del risultato, ma il raggruppamento piuttosto la Disciplina-Workcategory - quindi la ragione per la classe Grouping
iniziale soluzione basata su @Obalix
Edit 7-mar-2010:
Questa soluzione non funziona - Il GroupBy sull'oggetto Disciplina produrrà un raggruppamento univoco per ciascun oggetto. Penso che questo sia dovuto al fatto che è un tipo di riferimento. Ho ragione? Inizialmente l'ho accettato come risposta, tuttavia dopo alcuni grattacapi capì che i miei dati falsi erano errati. Le domande iniziali rimangono ancora risposte.
var result = repository.GetJobsWithActiveStatus()
.GroupBy(x => x.disc)
.Select(g => new Grouping
{
Discipline = g.Key,
Catergories = g.GroupBy(x=>x.workCat) // <--- The Problem is here, grouping on a reference type
.Select(l=>l.Key) // needed to select the Key's only
.ToList()
});
Ho dato un'occhiata al link e leggendo i commenti mi ha portato ad un altro post, quindi avremo uno sguardo più avanti. Sto comunque cercando un risultato fortemente tipizzato (Raggruppamento) – Ahmad
Quindi sostituisci semplicemente il 'new {}' di 'new StrongType {}'. E istedad di jusing 'Key',' Count' e 'WorkCategoryGroups' usano i membri personalizzati. L'approccio esteso descritto dal link è fortemente digitato. – AxelEckenberger
FYI - il post nella risposta di cui sopra è ottimo - c'è un post di follow up su Dynamic GroupByMany anche se qualcuno è interessato http://blogs.msdn.com/mitsu/archive/2008/02/07/linq -groupbymany-dynamically.aspx – Ahmad