NHibernate 3. QueryOver中"ThenFetch"的替代品

pso*_*usa 13 nhibernate linq-to-nhibernate queryover

我正在将NHibernate 3.0与LINQ提供程序和QueryOver一起使用.有时我想急切加载相关数据,并且在LINQ和QueryOver中都有"获取"方法.现在我有一个特殊的场景,我想在第二层上不直接加载属性,例如:

Foo f = ...;
f.A.B.C
Run Code Online (Sandbox Code Playgroud)

使用LINQ没有问题,因为您可以使用"ThenFetch"方法"链接"提取,如:

var result = Session.Query<Foo>().Fetch(a => a.A).ThenFetch(b => b.B).ThenFetch(c => c.C).ToList();
Run Code Online (Sandbox Code Playgroud)

在QueryOver中没有这样的方法,那么如何才能获得相同的结果呢?

提前致谢.

pso*_*usa 16

我实际上设法使用两种不同的方法来解决这个问题:

方法一:

Session.QueryOver<Foo>().Fetch(x => x.A).Fetch(x => x.A.B).Fetch(x => x.A.B.C)
Run Code Online (Sandbox Code Playgroud)

方法二:

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)
Run Code Online (Sandbox Code Playgroud)

两者都有效(尽管我不确定其中一个是否产生了"内部"而另一个产生了"外部"连接).

  • 我把它取回来,如果你为集合指定连接类型它确实有效,默认情况下它会尝试内部连接.如果指定左外连接,则它可以完美地工作. (5认同)

xan*_*tos 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) 
Run Code Online (Sandbox Code Playgroud)