2016-10-05 95 views
1

我有一个查询:实体框架分组柱从加入

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?我想知道如何使用'收藏'栏来做到这一点。

  2. 是否有可能强制EF生成COUNT(DISTINCT列)? IQueryable.GroupBy.Select(X => x.Select(N => n.Number).Distinct()。COUNT())生成具有很少的子查询,其慢得多然后COUNT(DISTINCT)

+0

约2: 我没有找到如何生成COUNT(DISTINCT列),但找到了如何生成更有效的查询然后使用linq的方式:IQlessable.GroupBy(x => new { x.Id,x.Number})。GroupBy(x => x.Key.Id) .Select(x => new {x.Key,Count = x.Count}) 它生成GroupBy只有一个子查询' select distinct“,这比从标准linq方法Dictinct()。Count()中查询更有效,但我仍然想知道是否可以生成sql COUNT(DISTINCT列) – Itan

回答

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会再次生成一个查询,其中包含少量子查询。但主要问题解决了