Как создать сводную таблицу с динамическим столбцом, используя выражение дерева 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;
}
Надеюсь, это поможет.