2011-02-08 56 views
5

Estoy escribiendo una aplicación web asp.net C#; Tengo una tabla de datos en memoria llamada 'table1' que tiene tres columnas 'country', 'productId' y 'productQuantity'; Quiero pivotar esa tabla para obtener una nueva tabla (suponga 'table2') con la primera columna 'country' como una columna fija y un número dinámico y los nombres de las columnas 'product_1', 'product_2', ... , 'product_n' de acuerdo con el número total de productos existentes en 'table1'; la primera columna 'country' debe contener el nombre del país; la dinámica generada columnas 'product_1', 'product_2', ..., 'product_n' debe contener al productQuantity que ha sido selled para cada producto específico en el país especificadocómo crear una tabla dinámica con una columna dinámica utilizando la expresión de árbol linq

estoy usando expresiones de consulta de Linq para escribir el código; el problema es que no puedo codificar los nombres ni los valores de los productos; no puedo predecir la cantidad de productos que existen en la tabla de datos; por ahora, estoy probando los resultados utilizando la siguiente expresión:

var query = table1.AsEnumerable() 
       .GroupBy(c => c.country) 
       .Select(g => new 
       { 
        country = g.Key, 
        product_1 = g.Where(c => c.productId == "a30-m").Select(c => c.productQuantity).FirstOrDefault(), 
        product_2 = g.Where(c => c.productId == "q29-s").Select(c => c.productQuantity).FirstOrDefault(), 
      . 
      . 
      . 
        product_n = g.Where(c => c.productId == "g33-r").Select(c => c.productQuantity).FirstOrDefault() 
       }); 

i estoy dando un ejemplo de cómo 'table1' Aspecto del producto y cómo 'table2' debe verse como:

view example image of the two tables table1 and table2

¿Alguien puede por favor ayudarme a encontrar una solución para crear una tabla dinámica con columna dinámica utilizando la expresión de árbol linq u otros métodos linq; cualquier ayuda sería muy apreciada.

+0

esperando ayuda ... – user598956

Respuesta

0

He estado utilizando esta extensión para la lista pivotante.

public static Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>> Pivot<TSource, TFirstKey, TSecondKey, TValue>(this IEnumerable<TSource> source, Func<TSource, TFirstKey> firstKeySelector, Func<TSource, TSecondKey> secondKeySelector, Func<IEnumerable<TSource>, TValue> aggregate) 
    { 
     var retVal = new Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>>(); 

     var l = source.ToLookup(firstKeySelector); 
     foreach (var item in l) 
     { 
      var dict = new Dictionary<TSecondKey, TValue>(); 
      retVal.Add(item.Key, dict); 
      var subdict = item.ToLookup(secondKeySelector); 
      foreach (var subitem in subdict) 
      { 
       dict.Add(subitem.Key, aggregate(subitem)); 
      } 
     } 
     return retVal; 
    } 

Hope this help.

+0

gracias por su respuesta, pero no funcionó en mi caso. – user598956

2

No es posible consultar un número dinámico de columnas en sql. Por extensión, no es posible hacer eso con linq ya que está basado en sql.

Así que estás de suerte, lo siento.

Sin embargo, puede solicitar todos los pares existentes de {country, product}sql del servidor y hacer el procesamiento restante en el cliente (la reconstrucción de países y productos haciendo .Select(x => x.product).Distinct() y así sucesivamente, y luego dinámicamente crear columnas en una cuadrícula de datos).

Cuestiones relacionadas