2016-10-05 92 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會再次生成一個查詢,其中包含少量子查詢。但主要問題解決了