2012-10-24 120 views
1

我有三個表A,B和C. A是B中多發子記錄和C.獲取查詢結果副本

父表當我查詢到AI我得到了太多的記錄,彷彿FNH正在做笛卡爾產品。

我查詢的形式爲:

var list = session.Query<A>() 
    .Fetch(a=> a.Bs) 
    .Fetch(a=> a.Cs) 

其中基站爲一的IList的財產,和C是A的IList的財產

我應該只得到儘可能多的燒烤是涉及到A,並且只有很多C與A相關。相反,我得到每個BxC元素。

有沒有更好的方法來加載這些?我很確定我過去避免了這個確切的問題,但是在我的舊示例代碼中沒有看到它。

回答

2

我不知道這是否是NH錯誤或地圖問題,但查詢可以優化到

session.Query<A>() 
    .Fetch(a=> a.Bs) 
    .ToFuture(); 

var results = session.Query<A>() 
    .Fetch(a=> a.Cs) 
    .ToFuture() 
    .ToList(); 
+0

也做到了,謝謝你。我不熟悉ToFuture,但我的兒子會! –

+0

未來將批量選擇,每個將初始化一個集合。會話緩存會將結果關聯在一起,並導致兩個集合初始化 – Firo

2

你可以使用一個變壓器來得到不同的結果:

var list = session.Query<A>() 
    .Fetch(a=> a.Bs) 
    .Fetch(a=> a.Cs) 
    .SetResultTransformer(Transformers.DistinctRootEntity) 

這是NH3.2語法,2.1則需要使用新的DistinctRootEntityTransformer()(我認爲)作爲參數傳遞給SetResultTransformer代替。