2013-07-23 116 views
2

我试图急切地加载一个嵌套集合的实体。具体如下:NHibernate - 嵌套热切加载被忽略

父 - > Children1 - >如GrandChild - > GreatGrandChildren

这里是我的4次尝试之一(这是最有前途的):

Parent parent = null; 
      Child child = null; 
      GrandChild grandChild = null; 
      GreatGrandChild greatGreatChild = null; 
      var result = CurrentSession.QueryOver<Parend>(() => conj) 
       .Where(c => c.Id == id) 
       .JoinAlias(() => parent.Children,() => child) 
       .JoinAlias(() => child.GrandChild,() => grandChild) 
       .JoinAlias(() => grandChild.GreatGrandChildren ,() => greatGrandChild) 
       .List<Parent>(); 

这会产生预期的SQL中,大量的左外连接。由于连接,还会返回大约800个相同的父母。

但是,当我通过for循环中的代码访问第一个父代的列表时,数据库被无数次命中,完全忽略了以前的查询。

任何想法?

信息:NHibernate 3.3; DB:Oracle; VS2012 - ASP.NET

感谢

+1

我有同样的问题,你是否设法解决这个问题? 奇怪的是,它适用于MSSQL,但不适用于Oracle。 –

回答

0

应该有这样的工作:

QueryOver<Parent>() 
.Where(c => c.Id == id) 
.Inner.JoinQueryOver(p => p.Children) 
.Inner.JoinQueryOver(c => c.GrandChild) 
.Inner.JoinQueryOver(g => g.GreatGrandChildren) 
.Fetch(p => p.Children).Eager 
.Fetch(p => p.Children.GrandChild).Eager 
.Fetch(p => p.Children.GrandChild.GreatGrandChildren).Eager 
.TransformUsing(Transformers.DistinctRootEntity) 

Fetch.Eager告诉NH到一个请求中加载这些嵌套集合,TransformUsing基本上告诉它你想要一个不同于父母