2012-01-11 43 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