Я пытаюсь написать запрос 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)