LINQ查询具有分组依据和多个计数

时间:2019-07-11 21:05:13

标签: c# linq entity-framework-6 linq-to-entities

我正在尝试使用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)

1 个答案:

答案 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)