2011-02-08 13 views
5

私はasp.net C# Webアプリケーションを作成しています。 私は 'table1'という名前のメモリ内データテーブルを持ち、 'country'、 'productId'、 'productQuantity'という3つのカラムを持っています。 最初の列 'country'を固定列にし、動的数値と列名を 'product_1'、 'product_2'とする新しいテーブル( 'table2'とします)を取得するには、そのテーブルをピボットします。 'table1'に存在する製品の総数に応じて 'product_n'、 最初の列 'country'には国名が含まれている必要があります。 ダイナミックに生成された列「product_1」、「product_2」、...、「product_n」私は書くためのLINQクエリ式を使用している指定国linqツリー式を使用して動的列を持つピボットテーブルを作成する方法

に各特定の製品のためにselledされたproductQuantityが含まれている必要がありますコード;問題は、私はハードコードの名前を製品のどちらの値もできないということです。私はどのくらいの製品がデータテーブルに存在するか予測できません。

view example image of the two tables table1 and table2

:i「は table1」のように見え、どのように「 table2」のように見える必要がありますどのように例を与えている

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() 
       }); 

:今、私は次の式を使用して結果をテストしてるため

誰でも、linqツリー式または別のlinqメソッドを使用して動的列を持つピボットテーブルを作成するためのソリューションを見つけるのを手伝ってください。 ご協力いただければ幸いです。

+0

ヘルプをお待ちしております... – user598956

答えて

0

私はこの拡張機能をピボットリストに使用しています。

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; 
    } 

このヘルプが必要です。

+0

あなたの返事に感謝しますが、私の場合はうまくいきませんでした。 – user598956

2

sqlの動的な列数を照会することはできません。拡張子では、SQLをベースにしているので、linqでそれを行うこともできません。

あなたは運が悪いです、ごめんなさい。あなたは(.Select(x => x.product).Distinct()を行うことによって、国や製品を再構築し、その上、その後、動的にデータグリッドの列を作成する)sqlサーバから{country, product}のすべての既存のペアを要求し、クライアント上で、残りの処理を行うことができますしかし

関連する問題