我在LINQ提供程序和QueryOver中使用NHibernate 3.0。有时我想急切加载相关数据,并且在LINQ和QueryOver中都有“获取”方法。现在我有一个特殊的场景,我想在第二级别上直接加载属性,例如:
Foo f = ...;
f.A.B.C
使用LINQ没有问题,因为您可以使用“ThenFetch”方法“链接”提取,如:
var result = Session.Query<Foo>().Fetch(a => a.A).ThenFetch(b => b.B).ThenFetch(c => c.C).ToList();
在QueryOver中没有这样的方法,那么如何才能获得相同的结果呢?
提前致谢。
答案 0 :(得分:16)
我实际上设法使用两种不同的方法来解决这个问题:
方法一:
Session.QueryOver<Foo>().Fetch(x => x.A).Fetch(x => x.A.B).Fetch(x => x.A.B.C)
方法二:
A a = null;
B b = null;
C c = null;
Session.QueryOver<Foo>()
.JoinAlias(x => x.A, () => a)
.JoinAlias(() => a.B, () => b)
.JoinAlias(() => b.C, () => c)
两者都有效(尽管我不确定其中一个是否产生了“内部”而另一个产生了“外部”连接)。
答案 1 :(得分:16)
就像好奇心一样,我会在NHibernate Jira上发布他们给我的回复:
query
.Fetch(p => p.B)
.Fetch(p => p.B.C) // if B is not a collection ... or
.Fetch(p => p.B[0].C) // if B is a collection ... or
.Fetch(p => p.B.First().C) // if B is an IEnumerable (using .First() extension method)
答案 2 :(得分:4)
我认为你可以用JoinQueryOver
来做到这一点IQueryOver<Relation> actual =
CreateTestQueryOver<Relation>()
.Inner.JoinQueryOver(r => r.Related1)
.Left.JoinQueryOver(r => r.Related2)
.Right.JoinQueryOver(r => r.Related3)
.Full.JoinQueryOver(r => r.Related4)
.JoinQueryOver(r => r.Collection1, () => collection1Alias)
.Left.JoinQueryOver(r => r.Collection2, () => collection2Alias)
.Right.JoinQueryOver(r => r.Collection3)
.Full.JoinQueryOver(r => r.People, () => personAlias);