considerar los siguientes objetos simplificados y relaciones:Cómo agrupar varios elementos 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;
}
Los modelos anteriores de una relación que una Job
está asociada con una Discipline
y uno WorkCategory
. El Workcategory
siempre es hijo de un padre específico Discipline
(relación de uno a muchos). Podemos suponer que la relación entre la Disciplina asignada y la Categoría de trabajo siempre será válida.
El problema al que me enfrento es cuando intento crear un objeto de resultado Grouping
basado en los filtros que se aplican a Jobs
. No estoy seguro de si esto puede hacerse o si el enfoque que estoy tomando es incluso correcto. La pregunta exacta en sí no es clara para mí, sin embargo, lo anterior define la declaración del problema.
- ¿Se puede mejorar el diseño?
- ¿Cómo puedo agrupar trabajos por disciplina y categoría de trabajo?
- ¿Necesito siquiera la clase
Grouping
?
He intentado lo siguiente (este es mi primer intento de usar Linq), pero sin éxito ya que mi comprensión no es lo suficientemente completa. La otra alternativa es obtener primero el grupo Discipline
y recorrer la agrupación original seleccionando el relacionado 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
}});
Editar: Después de haber publicado esto, me di cuenta de que los parámetros GroupBy Inital dan lugar a un grupo de punto mientras que yo estoy buscando resultados del grupo-subgrupo.
Edición 2: Para clarificar un poco más lejos, no quiero The Associated Jobs como parte del resultado, pero agrupación más bien la disciplina-Workcategory - por lo tanto la razón de la clase Grouping
Inicial solución basada en @Obalix
Editar 7-Mar-2010:
Esta solución no funciona: el GroupBy en el objeto Discipline generará una agrupación única para cada objeto. Creo que esto se debe a que es un tipo de referencia. ¿Estoy en lo correcto? Al principio acepté esto como la respuesta, sin embargo, después de algunos arañazos en la cabeza, me di cuenta de que mis propios datos falsos estaban defectuosos. Las preguntas iniciales siguen siendo respondidas.
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()
});
He echado un vistazo al enlace y la lectura de los comentarios me llevó a otra publicación, así que echaremos un vistazo a eso. Sin embargo, estoy buscando un resultado fuertemente tipado (Agrupación) – Ahmad
Luego simplemente reemplaza el 'nuevo {}' por 'nuevo StrongType {}'. E istedad de jusing 'Key',' Count', y 'WorkCategoryGroups' usa sus miembros personalizados. El enfoque extendido descrito por el enlace está fuertemente tipado. – AxelEckenberger
FYI - lo publicado en la respuesta anterior es excelente - hay una publicación de seguimiento sobre Dynamic GroupByMany también si alguien está interesado http://blogs.msdn.com/mitsu/archive/2008/02/07/linq -groupbymany-dynamically.aspx – Ahmad