2010-02-20 8 views
9

Mit Mitarbeitern und Untergebenen - Ich möchte einen Mitarbeiter mit der Anzahl der Untergebenen in einer Abfrage laden.So ordnen Sie die Anzahl der Auflistung einer Entität mit fluent-nhibernate zu

public class Employee 
{ 
    public Name {get;set;} 
    public int NumberOfSubordinates {get;set;} 
} 

Resultierende SQL sollte wie folgt aussehen:

select e.name, (select count(*) from subordinate s where s.employee_id = e.id) NumberOfSubordinates 
from employee e 
group by e.name 
order by NumberOfSubordinates desc 
+0

Nur eine Beobachtung mit der SQL, aber es scheint, dass dies eine schlechte Möglichkeit ist, die Daten, die Sie benötigen, sollte die Unterauswahl nicht mit einem JOIN in der untergeordneten Tabelle ersetzt werden, dann ein Count (*) darauf würde den gleichen Wert ergeben? Es scheint, als würden Sie den Abfrageplaner zwingen, eine ineffiziente Route zu wählen, indem Sie die oben genannten Schritte ausführen. Das ist für Sie keine Frage, aber im Moment suche ich genau danach. – Martin

Antwort

15

Sie diese Spalte als Formel-Karte könnte.

Map(x => x.NumberOfSubordinates) 
    .FormulaIs(@"select count(*) from subordinate where subordinate.employee_id = id"); 

Eine andere Herangehensweise besteht darin, Unterordnungen als eine inverse Tasche abzubilden und faul = "extra" zu verwenden. In diesem Fall wird Subordinates.Count das SQL count(*) ausführen, jedoch nicht als Teil der Anfangslast. Dieser Ansatz ist in Fluent möglicherweise noch nicht verfügbar.

+0

lassen Sie bitte wissen, wenn es in Fluent verfügbar ist. –

+0

Verwenden Sie 'ExtraLazyLoad' http://stackoverflow.com/a/5962775/265877 – Alex

+0

Während dies funktioniert, ich denke nicht, es ist effizient, da Sie eine Unterabfrage in Ihrer Select-Klausel ausführen. Gibt es eine Möglichkeit, in der Hauptabfrage die Child-Tabelle mit einer Gruppe zu verknüpfen? – Alex

Verwandte Themen