LINQ-запрос с группировкой по нескольким счетам - PullRequest
0 голосов
/ 12 июля 2019

Я пытаюсь написать запрос LINQ, используя linq-to-entity в EF 6, чтобы получить список водных бассейнов и связанных с ними счетчиков.Проблема заключается в том, что дочерние таблицы находятся в противоположных направлениях.

Я хочу сделать это без использования дополнительного выбора в предложении select по соображениям производительности.В SQL я бы обычно создавал производные представления, но не знаю, как это сделать с помощью Linq.

В бассейне есть несколько станций (скважин), связанных с ним как дочерние.Как родители, он может быть использован несколькими организациями, которые управляют бассейнами.Мне нужно количество станций и количество организаций на бассейн.

Я пробовал группировать, но, похоже, он поддерживает агрегирование только в одном направлении.

Сначала базовый запрос

(from b in EwmBasins
join s in EwmStations on b.BasinId equals s.BasinId into b_s_into
from b_s_from in b_s_into.DefaultIfEmpty()
join bp in EwmBasinPortions on b.BasinId equals bp.BasinId into bp_b_into
from bp_b_from in bp_b_into.DefaultIfEmpty()
join mnb in MonitoringNotificationBasins on bp_b_from.BasinPortionId equals mnb.BasinPortionId into mnb_bp_into
from mnb_bp_from in mnb_bp_into.DefaultIfEmpty()
where b.EwmB118VersionTypeId == EwmB118VersionTypes.Max(m => m.b118VersionTypeId)
group s_from.StationId by b into g
 select new 
 {
  BasinId = g.Key, 
  WellCount = g.ToList().Count(),
  //OrganizationCount = mnb_bp_from.MonitoringNotificatonId.Count() ??? how to do this
 }
)

Я ожидаю увидеть BasinId, # скважин и # организаций, таких как:

  1 | 7 | 2
  2 | 2 | 0
  ...

EDIT

(from basin in EwmBasins
 where basin.EwmB118VersionTypeId == EwmB118VersionTypes.Max(m => m.b118VersionTypeId)
 select new
 {
    basin,
    WellCount = basin.Stations.Count()
 }
).OrderBy(o => o.basin.BasinCode)

1 Ответ

0 голосов
/ 12 июля 2019

Похоже, что он работает с предложением @ NetMage с использованием навигационных свойств EF6. Он генерирует стек SQL-статистики, однако время выполнения не медленнее, чем выполнение запроса, опубликованного в моем вопросе, поэтому я пойду с ним.

(from b in dbContext.EwmBasins
                                 where b.EwmB118VersionTypeId == dbContext.EwmB118VersionTypes.Max(m => m.b118VersionTypeId)
                                 select new
                                 {
                                     Basin = b,
                                     WellCount = b.Stations.Count(),
                                     OrganizationCount = b.BasinPortions.Count(a => a.MonitoringNotificationBasins.Any(c => c.MonitoringNotification != null))
                                 }
                                ).OrderBy(o => o.Basin.BasinCode)
...