2016-10-05 1 views
1

ich die nächste Frage haben:Entity Framework Gruppierung für Spalte von beitreten

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. Haupt Frage: Ist Fähigkeit von Spalte Gruppierung besteht aus der Verbindung mit Linq? Ich frage mich, wie man es mit der Spalte "Sammlung" macht.

  2. Kann EF gezwungen werden, COUNT (Spalte DISTINCT) zu generieren? IQueryable.GroupBy.Select (x => x.Select (n => n.Number) .Distinct(). Count()) erzeugen Abfrage mit wenigen Unterabfragen die viel langsamer dann COUNT (DISTINCT)

+0

über 2: Ich habe nicht gefunden, wie COUNT (DISTINCT-Spalte) zu generieren, aber den Weg gefunden, wie effizientere Abfrage generieren dann mit linq: IQuarable.GroupBy (x => new { x.Id, x.Number}). GroupBy (x => x.Key.Id) .Wählen Sie (x => new {x.Key, Count = x.Count}) es generiert GroupBy mit nur einer Unterabfrage ' select distinct ', das ist effizienter als die Abfrage von Standard Linq Ansatz Dictinct(). Count(). Aber ich möchte immer noch wissen, ob es möglich ist, sql COUNT (DISTINCT Spalte) zu generieren – Itan

Antwort

0

I gefunden. Sie benötigen SelectMany mit dem zweiten Parameter verwenden 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(); 

Es erzeugt die gewünschte SQL, aber mit Ausnahme, die ich brauche Distinct Count durch Besuch.

Und wenn ich VisitCount = x.Distinct().Count() ändern, generiert EF erneut eine Abfrage mit wenigen Unterabfragen. Aber das Hauptproblem gelöst

Verwandte Themen