NHibernate - 嵌套的Eager加载被忽略

时间:2013-07-23 11:30:20

标签: c# nhibernate eager

我正试图急切地加载一个嵌套集合的实体。如下:

父母 - >儿童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

由于

1 个答案:

答案 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基本上告诉它你想要一个不同的父