2

我正在尝试急切地加载具有嵌套集合的实体。如下:

父 -> 子 1 -> 孙子 -> 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;数据库:甲骨文;VS2012 - ASP.NET

谢谢

4

1 回答 1

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

于 2013-07-23T15:14:41.280 回答