实体框架按连接列分组

时间:2016-10-05 00:19:44

标签: c# sql-server entity-framework linq

我有下一个查询:

select VisitLines.ProcedureId, COUNT(DISTINCT VisitLines.VisitId) as nt
from Visits
LEFT JOIN VisitLines ON Visits.Id = VisitLines.VisitId
WHERE Visits.VisitStatusId = 1 AND Visits.IsActive = 1 AND VisitLines.IsActive = 1 
GROUP BY VisitLines.ProcedureId
  1. 主要问题:是否有能力使用linq按连接列进行分组?我想知道如何使用' collection'列。

  2. 是否可以强制EF生成COUNT(DISTINCT列)? IQueryable.GroupBy.Select(x => x.Select(n => n.Number).Distinct()。Count())使用少量子查询生成查询,这比COUNT(DISTINCT)

1 个答案:

答案 0 :(得分:0)

我找到了。需要将SelectMany与第二个参数resultSelector一起使用:

dbContext.Visits.Where(x => x.IsActive)
                .SelectMany(x => x.VisitLines, (v, vl) => new
                {
                  v.Id,
                  vl.ProcedureId
                })
                .GroupBy(x => x.ProcedureId)
                          .Select(x => new
                          {
                              Id = x.Key,
                              VisitCount = x.Count()
                          }).ToArray();

它会生成所需的SQL,但有一个例外,我需要通过访问进行不同的计数。

如果我更改VisitCount = x.Distinct().Count(),那么EF会再次生成一个包含少量子查询的查询。但主要问题已解决