我正试图急切地加载一个嵌套集合的实体。如下:
父母 - >儿童1 - > 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
由于
答案 0 :(得分: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基本上告诉它你想要一个不同的父