c# – 使用nhibernate Criteria API进行Eager Fetching

前端之家收集整理的这篇文章主要介绍了c# – 使用nhibernate Criteria API进行Eager Fetching前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在多个表上使用标准Api和急切加载.

我的精简实体看起来像这样:

  1. class Limit
  2. {
  3. Risk {get; set;}
  4. }
  5.  
  6. class Risk
  7. {
  8. List<Company> Companies { get;set;}
  9. }
  10.  
  11. class Company
  12. {
  13. List<Address> OldAdresses {get;set;}
  14. }
  15.  
  16. class Address
  17. {
  18. string Street { get;set;}
  19. }

我的Criteria调用如下所示:

  1. var CriterionGruppe = Expression.Eq("Account.Id",someGuid);
  2.  
  3. var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
  4. .SetFetchMode("Risk",FetchMode.Eager)
  5. .SetFetchMode("Risk.Companies",FetchMode.Eager)
  6. .Add(CriterionGruppe)
  7. .SetResultTransformer(new DistinctRootEntityResultTransformer())
  8. .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

解决方法

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

然而,这是非常低效的.您正在加载大量重复数据以进行1 SQL查询.一个更好的方法

>加载实际需要的投影>使用Futures和Batched延迟加载来避免单个笛卡尔结果集并选择n 1.

猜你在找的C#相关文章