我试图在多个表上使用标准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;}
- }
我的Criteria调用如下所示:
- 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?
解决方法
- 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查询.一个更好的方法是
>加载实际需要的投影>使用Futures和Batched延迟加载来避免单个笛卡尔结果集并选择n 1.