2012-01-11 44 views
6

我想在多個表中使用條件Api與急切的加載。渴望與nhibernate條件提取API

我的簡裝實體是這樣的:

class Limit 
{ 
    Risk {get; set;} 
} 

class Risk 
{ 
    List<Company> Companies { get;set;} 
} 

class Company 
{ 
    List<Address> OldAdresses {get;set;} 
} 

class Address 
{ 
    string Street { get;set;} 
} 

我的標準調用如下:

var CriterionGruppe = Expression.Eq("Account.Id", someGuid); 

var temp = _transaktion.Session.CreateCriteria(typeof(Limit)) 
.SetFetchMode("Risk", FetchMode.Eager) 
.SetFetchMode("Risk.Companies", FetchMode.Eager) 
.Add(CriterionGruppe) 
.SetResultTransformer(new DistinctRootEntityResultTransformer()) 
.List<Limit>(); 

的地址仍然加載了許多選擇。我如何在我的標準調用中包含公司的舊地址。

我已經在ayende的博客和其他幾個問題在這裏閱讀了一個博客條目在stackoverflow。但仍然沒有運氣。

我希望有人能指出我正確的方向。

在此先感謝彼得

When must we use eager loading in NHibernate? What is it's usage?

NHibernate Eager Fetching Over Multiple Levels

Ayende Blog

回答

8
var account = _transaktion.Session.Load<Account>(someGuid); 
var temp = _transaktion.Session.CreateCriteria(typeof(Limit)) 
    .SetFetchMode("Risk", FetchMode.Eager) 
    .SetFetchMode("Risk.Companies", FetchMode.Eager) 
    .SetFetchMode("Company.OldAddresses", FetchMode.Eager) 
    .Add(Expression.Eq("Account", account)) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .List<Limit>(); 

然而,這是非常低效的。您正在加載大量的重複數據以進行1次sql查詢。更好的方法是

  1. 負載的實際需要的
  2. 利用期貨和成批的延遲加載的投影,以避免單一笛卡爾結果集,並選擇N + 1。
+0

謝謝。這是我希望的提示。我知道這並不是我查詢的方式。 – user631833 2012-01-11 15:58:03