Как создать сводную таблицу с динамическим столбцом, используя выражение дерева linq

Я пишу asp.net C# веб приложение; у меня есть данные в памяти под названием "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; Любая помощь приветствуется.

2 ответа

Невозможно запросить динамическое количество столбцов в sql, По расширению это невозможно сделать с помощью linq, так как он основан на SQL.

Так что тебе не повезло, извини.

Однако вы можете запросить все существующие пары {country, product} от sql сервер и выполнить оставшуюся обработку на клиенте (реконструировать страны и продукты, выполнив .Select(x => x.product).Distinct() и так далее, а затем динамически создавать столбцы в сетке данных).

Я использовал это расширение для сводного списка.

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

Надеюсь, это поможет.

Другие вопросы по тегам