linq crosstab

Usar Linq para crear resultados de tablas cruzadas



crosstab (4)

Posible duplicado:
¿Es posible pivotar datos usando LINQ?

Me pregunto si es posible crear resultados de estilo de tabla cruzada con Linq. Tengo algunos datos que se parecen a los siguientes:

var list = new[] { new {GroupId = 1, Country = "UK", Value = 10}, new {GroupId = 1, Country = "FR", Value = 12}, new {GroupId = 1, Country = "US", Value = 18}, new {GroupId = 2, Country = "UK", Value = 54}, new {GroupId = 2, Country = "FR", Value = 55}, new {GroupId = 2, Country = "UK", Value = 56} };

y estoy intentando enviar a un control de repetidor algo como el siguiente:

GroupId.....UK.....FR.....US 1...........10.....12.....18 2...........54.....55.....56

Son las columnas dinámicas que están causando mis problemas. Alguna solución a esto?


Después de hacer una búsqueda rápida, es posible que desee consultar las clases ModuleBuilder, TypeBuilder y FieldBuilder en System.Reflection.Emit. Le permiten crear una clase dinámicamente en tiempo de ejecución. Aparte de eso, necesitarías agrupar tus objetos y luego hacer algo con los resultados jerárquicos que obtienes de LINQ. No estoy seguro de una forma de crear dinámicamente campos de tipo anónimos en tiempo de ejecución, y eso suena a lo que tendría que suceder.


Necesitas una clase runtimy para mantener estos resultados runtimy. ¿Qué tal xml?

XElement result = new XElement("result", list.GroupBy(i => i.GroupId) .Select(g => new XElement("Group", new XAttribute("GroupID", g.Key), g.Select(i => new XAttribute(i.Country, i.Value)) ) ) );

¿Estás esperando múltiples registros por celda de resultados? Si es así, debería haber algún Suma (y más agrupación) allí.

(Esta respuesta es una prueba de concepto, no un resultado final. Hay varios problemas que abordar, como: ordenar columnas, faltar celdas, etc.).


Podría intentar usar la biblioteca dynamic linq proporcionada por MS. Tienen una cantidad de sobrecargas para los métodos de extensiones que toman cadenas como argumentos. También tienen un analizador de expresiones que toma una cadena y emite una expresión lambda. Debería poder crear una selección dinámica usándolos.

Sin embargo, una palabra de advertencia es que terminaste con un IQueryable no genérico en lugar de un IQueryable genérico, por lo que estás un poco limitado en lo que puedes hacer con el resultado, y dejas un poco de seguridad tipo, pero eso puede ser OK en tu aplicación ...

El enlace para las cosas dinámicas de linq es

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Hay un enlace donde puede descargar el código fuente de la biblioteca dinámica, además de algunas buenas ilustraciones de cómo puede usarlo.


var labResults = from lab in CoreLabResults where lab.Patient == 8 group lab by new { lab.Patient, lab.TestNo, lab.CollectedDate } into labtests select new { labtests.Key.Patient, labtests.Key.TestNo, labtests.Key.CollectedDate, MCHC = labtests.Where(lab => lab.TestVar == "MCHC").FirstOrDefault().Result, LYABS = labtests.Where(lab => lab.TestVar == "LYABS").FirstOrDefault().Result, TotalTests = labtests.Count() }