Как использовать в качестве результата для агрегации группировки лист?

184
11 декабря 2021, 15:30

Что-то похожее на, то что мне нужно здесь. Только мне хотелось бы это в виде LINQ и с возможностью агрегации не в строку, а в список.

Вот посмотрите, у меня есть такая таблица:

Я хочу выбрать Title, PackageId, Category, Advertiser, TemplateType, сгруппировать по Title, Category и TemplateType. А вот что касается Advertiser и PackageId, то тут не все так просто. Мне нужна агрегация, но не простая. Я не хочу искать максимум или сумму или среднее. Мне нужно поместить их в лист. Ну или хотя бы объединить в строку через запятую. В приведенной выше ссылке так и делается, но для SQL Server и там конкатенация в строку. А мне было бы идеально в лист.

Не нашел того, как это сделать. Может кто-то знает какой-то хитрый трюк?

Update

Поясню подробнее. Вот у меня есть такой запрос и результат работы:

А я хотел бы, чтоб две строки схлопнулись в одну, а колонка PackageId содержала бы два значения: com.track.event.new и com.track.event. И все это на LINQ. Было бы просто идеально!

Update 2

Как просили ниже в комментариях, я добавляю исходные данные.

Получены данные таким запросом

select  M."Title", P."PackageId", "Advertiser",  "Category", P."TemplateType" from "Pushes" P
inner join "ManuallySendings" M on P."ManuallySendingId" = M."ManuallySendingId"
where "PushType" = 'manually'

Как видите, есть еще таблица ManuallySendings из которой мне нужен только Title.

Пытаясь реализовать данную задачу я написал вот такой код:

 var pushes = _pushRepository.Pushes.Include(x => x.ManuallySending)
                .Where(x => x.PushType == "manually");
            var res = from push in pushes
                group push by new
                {
                    push.Category,
                    push.TemplateType,
                    push.ManuallySending,
                }
                into pg
                select new PushStatisticManuallySendingIndexViewModel
                {
                    Title = pg.Key.ManuallySending.Title,
                    AppIds = pg.Select(x => x.PackageId).Distinct(),
                    CategoryName = pg.Key.Category,
                    Id = pg.FirstOrDefault().ManuallySending.ManuallySendingId,
                    TemplateType = pg.Key.TemplateType
                };

Update 3

Я нашел как это сделать в базе данных (я использую Postgres)

select M."Title", array_agg(P."PackageId"), "Advertiser",  "Category", P."TemplateType"
from "Pushes" P
inner join "ManuallySendings" M on M."ManuallySendingId" = P."ManuallySendingId"
group by M."Title", "Advertiser", "Category", P."TemplateType";

Вот результат:

Осталась только понять, как сделать то же самое и на LINQ!

READ ALSO
Не получается установить поддержку c# в emacs

Не получается установить поддержку c# в emacs

Нужно установить в emacs поддержку c#, я пробовал курить мануалы на гитхабе, пытался ставить и csharp mode и omnisharpКонкретно не работает шаг M-x package-install...

88
Тесты NUnit не запускаются на netstandard2.1

Тесты NUnit не запускаются на netstandard2.1

У меня есть новый проект, создавал по гайду1: решение и в нём два проекта: MathUtilities и MathUtilitiesTests; всё через консоль, установлен

191
Проблема с ComboBox в WPF c#

Проблема с ComboBox в WPF c#

Проблема в том, что ComboBox не отображает возвращаемый элемент Начнём сначалаУ меня есть

216