2010-08-09 85 views
1

讓我來解釋一下這個問題 - 希望我已經在標題中定義了它,但我想確定。NHibernate - 動態定義抓取策略

我有一個linq查詢,拉回一堆對象(說Foos)。每個Foo擁有對用戶的引用。每個用戶擁有一個人的引用:

public class Foo 
{ 
    //properties omitted... 
    public User CreatedBy {get;} 
} 
public class User 
{ 
    //properties omitted... 
    public Person Person {get;set;} 
} 

作爲對象結構所揭示的,在數據​​庫中,富涉及多到一個用戶,和用戶涉及多到一個人。

當我運行查詢時,我爲Foos獲得一個SELECT,然後爲所有用戶和人員選擇一個SELECT。很明顯,我會更喜歡一個SELECT與一些聯接。

我不一定要在我的映射配置中指定Foos總是急於獲取用戶,或者用戶總是急於獲取Person,但我希望能夠在此實例中指定。

有沒有辦法做到這一點?

感謝

大衛

+0

是什麼意思:「在這種情況下指定」? – 2010-08-09 13:01:12

回答

3

所有的NHibernate查詢方法都有指定提前取指的方法。

對於標準,您有SetFetchMode

對於HQL,您有[inner|left] join fetch

For Linq yo have Expand(2.x contrib)/ Fetch(3.x)。

對於SQL您有AddJoin

+0

謝謝。這是我想要的Linq。這個新版本的Linq到NHibernate現在可用嗎?我找不到任何關於它的事情。 – David 2010-08-09 16:11:09

+0

http://sourceforge.net/projects/nhibernate/files/NHibernate/3.0。0Alpha1/NHibernate-3.0.0.Alpha1-bin.zip /下載 – 2010-08-09 17:54:32

+0

這是一個alpha?我可能只是把它留下一點然後... – David 2010-08-11 08:29:18

0

的NHibernate的動態抓取策略都Udi DahanRitesh Rao提供示例實現,這應該給你一個很好的起點。

0

除了Diegos不錯的答案:你也可以使用批處理。這降低沒有太多痛苦的N + 1問題:

上一流水平

使用批量大小:

<class name="Person" batch-size="20"> 
... 
</class> 

使用批量規模上收集等級:

<map 
    name="SomeCollection" 
    batch-size="20"> 
    ... 
</map> 

當過其中之一NHibernate加載20一次使用這樣的查詢:

select ... from Person where user_fk in (23, 34, 6, 667, 6745, 234 ....) 

所以它變成N+1N/20 + 1,這很不錯。