2016-10-05 2 views
1

У меня есть следующий запрос:Entity Framework группировка по столбцам из присоединиться

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.Select (п => n.Number) .distinct(). Count()) генерирует запрос с несколько подзапросов, которые гораздо медленнее, чем COUNT (DISTINCT)

+0

около 2: Я не нашел способ генерации столбца COUNT (DISTINCT), но нашел способ генерации более эффективного запроса, а затем используя linq: IQuaryable.GroupBy (x => new { x.Id, x.Number}). GroupBy (x => x.Key.Id) . Выберите (x => new {x.Key, Count = x.Count}) он генерирует GroupBy только с одним подзапросом ' select different ', который более эффективен, чем запрос стандартного linq-подхода Dictinct(). Count(). Но я все еще хочу знать, можно ли генерировать sql COUNT (столбец DISTINCT) – Itan

ответ

0

I найденный. Необходимо использовать 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 снова вызовет запрос с несколькими подзапросами. Но основная проблема решена.