9

我正在尝试使用NHibernate 3 alpha 1急切地加载所有集合。我想知道这是否是使用 ThenFetch() 的正确方法?

具有复数名称的属性是集合。其他只是一个对象。

            IQueryable<T> milestoneInstances = Db.Find<T, IQueryable<T>>(db =>
            from mi in db
            where mi.RunDate == runDate
            select mi).Fetch(mi => mi.Milestone)
                .ThenFetch(m => m.PrimaryOwners)
                .Fetch(mi => mi.Milestone)
                .ThenFetch(m => m.SecondaryOwners)
                .Fetch(mi => mi.Milestone)
                .ThenFetch(m => m.Predecessors)
                .Fetch(mi => mi.Milestone)
                .ThenFetch(m => m.Function)
                .Fetch(mi => mi.Milestone)
                .ThenFetchMany(m => m.Jobs)
                .ThenFetch(j => j.Source)
                ;

我想在NHibernate 论坛上问这个问题,但不幸的是,我所在的地方禁止访问谷歌群组。我知道Fabio在这里,所以也许 NHibernate 团队的人可以对此有所了解?谢谢

4

4 回答 4

10

ThenFetch显然,在这种情况下没有“正确”的使用方式。您的示例工作正常,但生成的 SQL 包含许多对 的连接Milestone,这是不对的。

使用IQueryOver而不是IQueryable允许您使用复杂的语法Fetch

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) 

因此,在您的情况下,它将是:

query // = session.QueryOver<X>()
    .Fetch(mi => mi.Milestone).Eager
    .Fetch(mi => mi.Milestone.PrimaryOwners).Eager
    .Fetch(mi => mi.Milestone.SecondaryOwners).Eager
    .Fetch(mi => mi.Milestone.Predecessors).Eager
    .Fetch(mi => mi.Milestone.Function).Eager
    .Fetch(mi => mi.Milestone.Jobs).Eager
    .Fetch(mi => mi.Milestone.Jobs.First().Source).Eager
于 2012-08-16T12:23:58.980 回答
3

您缺少的一件事是您应该使用 FetchMany() 和 ThenFetchMany() 是子属性是一个集合。

于 2011-01-02T13:28:45.400 回答
1
        IQueryable<T> milestoneInstances = Db.Find<T, IQueryable<T>>(db =>
        from mi in db
        where mi.RunDate == runDate
        select mi);

var fetch = milestoneInstances.Fetch(f => f.Milestone);
fetch.ThenFetch(f => f.PrimaryOwners);
fetch.ThenFetch(f => f.SecondaryOwners);
//...
于 2014-07-30T18:10:32.570 回答
0

正如 leora 所说,确保在获取您使用的子集合时

FetchMany()

ThenFetchMany()

一个新的 Fetch 应该从根中获取,但这并不总是发生。有时您需要将它们创建为单独的查询或使用 Criteria Futures 来批量获取多个。

于 2012-08-16T17:37:12.823 回答