5

我正在编写一个 asp.netC#网络应用程序;我有一个名为“ table1”的内存数据表,它有三列“ country”、“ productId”和“ productQuantity”;根据table2_ country_ product_1_ product_2_ product_n_ ' ' 中存在的产品总数table1;第一列“ country”必须包含国家名称;动态生成的列 ' product_1', ' product_2', ..., ' product_n' 必须包含productQuantity已在指定国家/地区销售的每种特定产品

我正在使用 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 的示例图像

谁能帮我找到一个使用linq树表达式或其他linq方法创建具有动态列的数据透视表的解决方案;任何帮助将非常感激。

4

2 回答 2

2

无法查询 中的动态列数sql。通过扩展,使用 linq 也无法做到这一点,因为它基于 sql。

所以你运气不好,对不起。

{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 回答