2011-03-25 48 views
7

給定一個多層次的對象圖使用未來作爲被稱爲:NHibernate的未來對象圖許多查詢

var Dads = db.Session.Query<Parent>().Where(P => P.EntityKey == Id) 
      .ToFuture<Parent>(); 
var Kids = db.Session.Query<Kid>().Where(K => K.Parent.EntityKey == Id) 
      .ToFuture<Kid>(); 

當我打電話VAR爸爸= dads.ToList()我看到了一批去跨線並顯示探查。

問題是枚舉它仍然是發送一次性查詢到DB

如集合時。

for each (Kid kid in Dad.Kids) // This seems to hit the database 
{ 
    Teach(kid); 
} 

發送SQL查詢並命中數據庫以獲取每個孩子。爲什麼沒有填充對象圖?或者是這種預期的行爲?

+0

這是一些令人不安的代碼。 – Ciel 2011-03-25 17:10:56

回答

4

該行爲是預期的。你只是簡單地告訴NHibernate從批處理數據庫中獲取兩個集合,它按照所述的方式執行。但是,你並沒有告訴它它們有關係。 NH期貨與期貨不會在執行後將實體放在一起,除非通過加入被告知這樣做。

如果您執行了不帶期貨的單獨查詢,那麼您不會期望父實體忽然填充子集合。基本上,期貨可以讓你在一次往返中運行。如果查詢碰巧與幾個子集合有共同的根(例如爲了避免笛卡爾積),那麼NH能夠將多個集合「組合」爲一個實體。

不幸的是,與NH LINQ Api和ToFuture()方法的連接似乎在當前(NH 3.0或3.1)實現中造成問題。在這種情況下,您可能需要使用QueryOver Api。

在附註中,我認爲方法名稱不合適。

編輯:編輯問題後,方法名稱現在可以。

+1

你是明智的。謝謝我最近看到很多人在尋找這種情況的答案。 – Firegarden 2011-03-28 14:54:41

+1

解決方案的一個例子可以在這裏找到:http://stackoverflow.com/questions/5266180/fighting-cartesian-product-x-join-when-using-nhibernate-3-0-0 – Firegarden 2011-03-29 12:03:47

+0

查詢碰巧有一個共同的根 - 請解釋你如何設置這個共同的根。 – joncodo 2012-06-22 17:53:01