Эквивалент Access SQL Transform используя LINQ.
Эквивалент Access SQL Transform используя LINQ.
Что-то у меня лыжи не едут... видимо асфальт комнчился...
В скуеле милкософтовского Аксесса есть оператор TRANSFORM.
Кто не в курсе - указывается из какой колонки исходной таблицы брать имена для колонок результирующей таблицы и как разместить данные в этих колонках.
Вот именно это мне и нужно - данные даются по-строчно, а видеть их хотят таблично.
Есть какая фича в линке чтобы так трансформировать исходник?
В доках не нашел, в инете предлагается как упражнение...
Я какую-то фигню написал, но не по табле и там слишком много линка получается...
Просмотрел предложенные варианты и опробовал их в работе...
Жуть... В смысле - не работает.
Опирался на вот это решение:
https://stackoverflow.com/questions/963491/pivot-data-using-linq
Имел следующие данные:
object[] Order_120074721_Glass = {new object[] { 1, 120074721, 1, 3085, "4 IP ADV 1.0 HST", 4, 2.8733, 20.7329, 2.8733 },new object[] { 1, 120074721, 1, 5104, "4 CLEAR G HST", 4, 2.8733, 20.7329, 2.8733 },new object[] { 2, 120074721, 1, 6005, "4-CLR G", 4, 2.8733, 20.7329, 2.8733 },new object[] { 3, 120074721, 1, 3085, "4 IP ADV 1.0 HST", 4, 2.8733, 20.7329, 2.8733 },new object[] { 3, 120074721, 1, 5104, "4 CLEAR G HST", 4, 2.8733, 20.7329, 2.8733 },new object[] { 1, 120074721, 2, 3085, "4 IP ADV 1.0 HST", 1, 0.5345, 10.3446, 0.5345 },new object[] { 1, 120074721, 2, 5104, "4 CLEAR G HST", 1, 0.5345, 10.3446, 0.5345 },new object[] { 2, 120074721, 2, 6005, "4-CLR G", 1, 0.5345, 10.3446, 0.5345 },new object[] { 3, 120074721, 2, 3085, "4 IP ADV 1.0 HST", 1, 0.5345, 10.3446, 0.5345 },new object[] { 3, 120074721, 2, 5104, "4 CLEAR G HST", 1, 0.5345, 10.3446, 0.5345 }};object[] Order_120074722_Glass = {new object[] { 1, 120074722, 1, 3087, "6 IP TOP 1.1 HST", 4, 2.8733, 30.7329, 2.8733 },new object[] { 1, 120074722, 1, 5105, "6 CLEAR G HST", 4, 2.8733, 30.7329, 2.8733 },new object[] { 2, 120074722, 1, 6006, "6-CLR G", 4, 2.8733, 30.7329, 2.8733 },new object[] { 3, 120074722, 1, 3086, "6 IP ADV 1.0 HST", 4, 2.8733, 30.7329, 2.8733 },new object[] { 3, 120074722, 1, 5105, "6 CLEAR G HST", 4, 2.8733, 30.7329, 2.8733 },new object[] { 1, 120074722, 2, 3087, "6 IP TOP 1.1 HST", 1, 0.5345, 40.3446, 0.5345 },new object[] { 1, 120074722, 2, 5105, "6 CLEAR G HST", 1, 0.5345, 40.3446, 0.5345 },new object[] { 2, 120074722, 2, 6006, "4-CLR G", 1, 0.5345, 40.3446, 0.5345 },new object[] { 3, 120074722, 2, 3086, "6 IP ADV 1.0 HST", 1, 0.5345, 40.3446, 0.5345 },new object[] { 3, 120074722, 2, 5105, "6 CLEAR G HST", 1, 0.5345, 40.3446, 0.5345 }};
Данные суммируются по "хитрым" правилам - 5-я - одна максимальная из группировки по 3 и 4 и , остальные - просто суммируются.
Затем колонки 0, 2 и 3 - дропаются.
Остается - длинный номер, строка и кучка остального мусора. Комбинация - длинный номер + строка - уникальны.
Эта часть - работает.
Дальше мне нужно получить довольно несложную вещь - словарик - ключ - длинный номер, значение - массив/список всех строк с этим значением.
Вроде как должен работать код приводимый под указанным выше ликом, но... набираются лишние строки.
Получается так:
Где покрутить чтобы пустые списки убрались?
Хорошо, Но не пойдет.
В том смысле, что Я имею желание получить из Pivot() корректные данные.
А пользованный Пивот был такой:
public static Dictionary<TKey1, Dictionary<TKey2, TValue>> Pivot3<TSource, TKey1, TKey2, TValue>( this IEnumerable<TSource> source , Func<TSource, TKey1> key1Selector , Func<TSource, TKey2> key2Selector , Func<IEnumerable<TSource>, TValue> aggregate) { return source.GroupBy(key1Selector).Select( x => new { X = x.Key, Y = source.GroupBy(key2Selector).Select( z => new { Z = z.Key, V = aggregate(from item in source where key1Selector(item).Equals(x.Key) && key2Selector(item).Equals(z.Key) select item ) } ).ToDictionary(e => e.Z, o => o.V) } ).ToDictionary(e => e.X, o => o.Y); }