Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Эквивалент Access​ SQL Transform используя LINQ.

489  
Murr патриот25.09.19 13:35
Murr
NEW 25.09.19 13:35 

Эквивалент Access SQL Transform используя LINQ.


Что-то у меня лыжи не едут... видимо асфальт комнчился...


В скуеле милкософтовского Аксесса есть оператор TRANSFORM.

Кто не в курсе - указывается из какой колонки исходной таблицы брать имена для колонок результирующей таблицы и как разместить данные в этих колонках.

Вот именно это мне и нужно - данные даются по-строчно, а видеть их хотят таблично.


Есть какая фича в линке чтобы так трансформировать исходник?

В доках не нашел, в инете предлагается как упражнение...


Я какую-то фигню написал, но не по табле и там слишком много линка получается...


#1 
AlexNek патриот27.09.19 19:29
AlexNek
27.09.19 19:29 
в ответ Murr 25.09.19 13:35
а видеть их хотят таблично.

именно видеть? В сторону horizontal grid не смотрел?

#2 
Срыв покровов коренной житель27.09.19 20:01
Murr патриот29.09.19 11:43
Murr
NEW 29.09.19 11:43 
в ответ AlexNek 27.09.19 19:29

Вроде не то, но в понедельник посмотрю подробнее.

#4 
Murr патриот29.09.19 11:45
Murr
NEW 29.09.19 11:45 
в ответ Срыв покровов 27.09.19 20:01

Да, близко.

Надо смотреть подробнее и тестить.


А вообще - да, хорошо мозги вправил - про PIVOT Я подзабыл и не смотрел. Спасибки.

#5 
Murr патриот11.10.19 11:27
Murr
NEW 11.10.19 11:27 
в ответ Murr 29.09.19 11:45

Просмотрел предложенные варианты и опробовал их в работе...

Жуть... В смысле - не работает.


Опирался на вот это решение:

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 - дропаются.

Остается - длинный номер, строка и кучка остального мусора. Комбинация - длинный номер + строка - уникальны.

Эта часть - работает.


Дальше мне нужно получить довольно несложную вещь - словарик - ключ - длинный номер, значение - массив/список всех строк с этим значением.

Вроде как должен работать код приводимый под указанным выше ликом, но... набираются лишние строки.

Получается так:


Где покрутить чтобы пустые списки убрались?

#6 
Срыв покровов коренной житель11.10.19 11:59
NEW 11.10.19 11:59 
в ответ Murr 11.10.19 11:27

dict = dict.Where(x => x.Value.Count() > 0)

.ToDictionary(x => x.Key, x => x.Value);


#7 
Murr патриот11.10.19 12:16
Murr
NEW 11.10.19 12:16 
в ответ Срыв покровов 11.10.19 11:59

Хорошо, Но не пойдет.

В том смысле, что Я имею желание получить из 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); } 

#8 
Murr патриот11.10.19 12:32
Murr
NEW 11.10.19 12:32 
в ответ Murr 11.10.19 12:16

Плюнул на Pivot() и вроде как собрал по-проще:

glassTypes.Cast<R65.BO.TGlassTypes.Row>()
.GroupBy(r => r.OrderNo)
.ToDictionary(s => s.Key, l => l.ToList())

.Dump("Pivot Glass");

Теперь надо подкорректировать актуальную подстановку...

#9