2008-11-26 25 views
8

Duplicar posible:
Is it possible to Pivot data using LINQ?El uso de LINQ para crear referencias cruzadas resultados

Me pregunto si es del todo posible para crear resultados estilo de tabla de referencias cruzadas con LINQ. tengo algunos datos que tiene el siguiente aspecto:

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 yo estoy tratando de salida a un algo de control del repetidor como los siguientes:

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

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

+3

Esta pregunta se refiere a un pivote contra columnas de resultados desconocidos. El duplicado propuesto es un pivote contra columnas de resultados conocidos. Estas dos situaciones son bastante diferentes. Votando para reabrir –

Respuesta

1

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 debería suceder.

+0

¿Puede decirme por qué se votó negativamente? ¿Dónde estoy incorrecto? – David

4

Necesita una clase runtime para tener 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á esperando múltiples registros por celda de resultado? Si es así, debería haber algún Suma (y más agrupación) allí.

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

1

Puede 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, termina con un IQueryable no genérico en lugar de un IQueryable genérico, por lo que está un poco limitado en lo que puede hacer con el resultado, y renuncia a un tipo de seguridad, pero que puede estar bien en su aplicación ...

el enlace para la materia de LINQ dinámica 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 se puede descargar el código fuente de la dinámica de la biblioteca, además de algunos bonitas ilustraciones de cómo puedes usarlo.

1
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() 
        } 
+1

Una solución simple ... pero no funcionará donde no se sepa qué valor tendrá "Lab". – Quango

Cuestiones relacionadas