我正在尝试使用EF 6中的linq-to-entities编写LINQ查询,以检索水盆及其相关计数的列表。问题是他的子桌子方向相反。
出于性能原因,我希望不使用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
...
编辑
(from basin in EwmBasins
where basin.EwmB118VersionTypeId == EwmB118VersionTypes.Max(m => m.b118VersionTypeId)
select new
{
basin,
WellCount = basin.Stations.Count()
}
).OrderBy(o => o.basin.BasinCode)
答案 0 :(得分:0)
使用EF6导航属性,它似乎可以与@NetMage的建议配合使用。它确实会生成一堆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)