5

私はasp.net C#Webアプリケーションを書いています。' '、' '、' ' の3table1つの列を持つ' ' という名前のメモリ内データテーブルがあります。そのテーブルをピボットして、最初の列 ' ' を固定列とし、動的な番号と列名 ' '、' '、...、' ' に従って新しいテーブル (' ' と仮定) を取得したい' ' に存在する製品の総数。最初の列 ' ' には国名を含める必要があります。動的に生成された列 ' '、' '、...、' 'には、指定された国で特定の製品ごとに販売された が含まれている必要がありますcountryproductIdproductQuantitytable2countryproduct_1product_2product_ntable1countryproduct_1product_2product_nproductQuantity

私は Linq クエリ式を使用してコードを記述しています。問題は、製品の名前も値もハードコーディングできないことです。データテーブルに存在する製品の数を予測できません。今のところ、次の式を使用して結果をテストしています。

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

table1「 」がどのように見えるか、「 」がどのように見えるtable2必要があるかについての例を示しています。

table1 と table2 の 2 つのテーブルのサンプル画像を表示

linqツリー式または別のlinqメソッドを使用して動的列を持つピボットテーブルを作成するための解決策を見つけるのを手伝ってくれませんか? どんな助けでも大歓迎です。

4

2 に答える 2

2

で列数を動的に照会することはできませんsql。ひいては、linqはsqlに基づいているため、linqでもそれを行うことはできません。

だからあなたは運が悪いです、ごめんなさい。

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

于 2011-02-08T22:42:32.027 に答える
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;
    }

この助けを願っています。

于 2011-02-08T03:38:47.273 に答える