我正在尝试使用急切地加载所有集合NHibernate 3 阿尔法 1 http://nhforge.org/media/p/690.aspx。我想知道这是否是使用 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 论坛 http://groups.google.com/group/nhusers但不幸的是,我所在的地方禁止访问谷歌群组。我知道Fabio https://stackoverflow.com/users/360080/fabio-maulo就在这里,也许 NHibernate 团队的人可以解释一下这一点?
谢谢
显然,没有“正确”的使用方法ThenFetch
在这种情况下。您的示例工作正常,但生成的 SQL 包含许多连接Milestone
,这是不对的。
Using IQueryOver
代替IQueryable
允许您使用复杂的语法 https://nhibernate.jira.com/browse/NH-2972?focusedCommentId=22151#comment-22151 in 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)