2010-02-20 88 views
9

與員工和下屬 - 我想在一個查詢中加載一個員工的下屬人數。如何將收集計數映射到實體與流利-Nhibernate

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

產生的SQL應該像:

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

只需觀察一下SQL,但看起來這是獲取所需數據的不好方法,不應將子選擇替換爲從屬表上的JOIN,然後在其上計數(*)會導致相同的價值?看起來好像你正在迫使查詢計劃者通過執行上述操作來獲取低效率的路由。與你沒有太大關係是問題,但這正是我目前所需要的。 – Martin 2012-11-28 21:29:01

回答

15

您可以映射此列的公式。

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

一種不同的方法是映射下屬作爲反向袋,並使用懶惰=「額外」。在這種情況下,Subordinates.Count將執行SQL count(*),但不是初始加載的一部分。這種方法在Fluent中尚不可用。

+0

請讓使用知道什麼時候在Fluent中可用。 – 2011-04-24 21:13:42

+0

使用'ExtraLazyLoad' http://stackoverflow.com/a/5962775/265877 – Alex 2012-04-12 16:38:48

+0

雖然這個工作,我認爲它不是很有效率,因爲你在你的select子句中運行子查詢。有沒有一種方法可以在主查詢中通過一個group來加入子表格? – Alex 2012-04-12 16:57:42