2011-01-26 56 views
13

我使用NHibernate 3.0与LINQ提供程序和QueryOver。有时候我想要加载相关的数据,并且在LINQ和QueryOver中都有“获取”的方法。现在我有我想要的渴望负荷特性的特殊情况下不能直接放在第二个层次,如:NHibernate 3. QueryOver中的“ThenFetch”的替代

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中没有这样的方法,所以我怎样才能达到相同的结果?

在此先感谢。

回答

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) 

这两个工作(虽然我不完全确定是否其中一个产生“内”和另一个“外”加入)。

+0

方法有两个,似乎只为一个工作,一,它失败的集合。 – Phill 2011-04-12 06:51:52

+5

我回过头来看,如果你指定了集合的连接类型,它会工作,默认情况下它会尝试一个内部连接。如果你指定一个左外连接,它可以很好地工作。 – Phill 2011-04-12 07:10:07

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); 
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)