как сгруппировать по родителю и применить агрегатную функцию к своим детям в LinQ Lambda - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть таблица SQL, которая содержит отношения родитель-потомок в своей собственной схеме через столбец ParentId.Есть несколько других таблиц (Продажа и т. Д.), Связанных с ним через столбец LocationId.Я после группировки данных на основе родителей второго уровня (код: xxxxx.xxxxx), а затем применить некоторые агрегатные функции, такие как SUM и COUNT, к своим дочерним элементам и самому себе .

Результат ожидания дляобщий объем продаж в 2 регионах (Виктория, Южная Австралия) будет выглядеть примерно так:

DisplayName      TotalSale
Victoria         $25,000
South Australia  $30,000

enter image description here

1 Ответ

0 голосов
/ 18 апреля 2019

Мне удалось решить вышеуказанную ситуацию с помощью столбца Код в таблице:

var t = await _jobRepository.GetAll().Include(p => p.Applications)
                                           .Include(p => p.Location)
                                           .Include(p => p.InvoiceItem)
                                           .Where(p => p.PublishDate.HasValue)
                                           .Where(p => p.PublishDate.HasValue)
                                           .Where(p => p.PublishDate.Value.Year == Clock.Now.Year && p.PublishDate.Value.Month == Clock.Now.Month)
                                           .Where(p => p.Location.Code.Length >= 11)
                                           .GroupBy(p => p.Location.Code.Substring(0, 11), p => p, (parentLocation, job) => new { parentLocation, job })
                                           .Select(p => new RegionalStatCountryToBeChanged()
                                           {
                                               RegionName = p.job.Select(q => q.Location).FirstOrDefault(q => q.Code == p.parentLocation).DisplayName,
                                               NumberOfAds = p.job.Count(),
                                               NumberOfApplications = p.job.SelectMany(q => q.Applications).Count(),
                                               Sales = p.job.Select(q => q.InvoiceItem).Sum(q => q.Price)
                                           })
                                           .ToListAsync();
...