在复杂对象图上使用Queryover API进行NHibernate加载

在复杂对象图上使用Queryover API进行NHibernate加载,nhibernate,queryover,Nhibernate,Queryover,我有一个非常复杂的对象图,我想一次加载 猛扑 样本有日志,日志测试有日志 结果 日志测试有测试键,日志结果有结果键,以及 测试键有结果键 我使用QueryOver API和Future将所有这些作为一个查询运行, 以及NHibernate实例化整个系统所需的所有数据 正在返回图表,并由NHProf验证 public static IList<Daylog> DatablockLoad(Isession sess, ICollection<int&

我有一个非常复杂的对象图,我想一次加载 猛扑

样本有日志,日志测试有日志 结果

日志测试有测试键,日志结果有结果键,以及 测试键有结果键

我使用QueryOver API和Future将所有这些作为一个查询运行, 以及NHibernate实例化整个系统所需的所有数据 正在返回图表,并由NHProf验证

                public static IList<Daylog> DatablockLoad(Isession sess,
ICollection<int> ids)
                {
                        var daylogQuery = sess.QueryOver<Daylog>()
                                .WhereRestrictionOn(dl => dl.DaylogID).IsIn(ids.ToArray())
                                .Fetch(dl => dl.Tests).Eager
                                .TransformUsing(Transformers.DistinctRootEntity)
                                .Future<Daylog>();

                        sess.QueryOver<DaylogTest>()
                                .WhereRestrictionOn(dlt =>
dlt.Daylog.DaylogID).IsIn(ids.ToArray())
                                .Fetch(dlt => dlt.Results).Eager
                                .Inner.JoinQueryOver<TestKey>(dlt => dlt.TestKey)
                                .Fetch(dlt => dlt.TestKey).Eager
                                .Inner.JoinQueryOver<ResultKey>(tk => tk.Results)
                                .Fetch(dlt => dlt.TestKey.Results).Eager
                                .Future<DaylogTest>();

                        sess.QueryOver<DaylogResult>()
                                .Inner.JoinQueryOver(dlr => dlr.DaylogTest)
                                .WhereRestrictionOn(dlt =>
dlt.Daylog.DaylogID).IsIn(ids.ToArray())
                                .Fetch(dlr => dlr.ResultKey).Eager
                                .Fetch(dlr => dlr.History).Eager
                                .Future<DaylogResult>();

                        var daylogs = daylogQuery.ToList();

                        return daylogs;
                }
公共静态IList数据块加载(Isession sess、,
i收集ID)
{
var daylogQuery=sess.QueryOver()
.WhereRestrictionOn(dl=>dl.DaylogID).IsIn(id.ToArray())
.Fetch(dl=>dl.Tests).Eager
.变压器使用(变压器.距离)
.Future();
sess.QueryOver()
.WhereRestrictionOn(dlt=>
dlt.Daylog.DaylogID).IsIn(id.ToArray())
.Fetch(dlt=>dlt.Results)
.Inner.JoinQueryOver(dlt=>dlt.TestKey)
.Fetch(dlt=>dlt.TestKey)
.Inner.JoinQueryOver(tk=>tk.Results)
.Fetch(dlt=>dlt.TestKey.Results)
.Future();
sess.QueryOver()
.internal.JoinQueryOver(dlr=>dlr.DaylogTest)
.WhereRestrictionOn(dlt=>
dlt.Daylog.DaylogID).IsIn(id.ToArray())
.Fetch(dlr=>dlr.ResultKey).Eager
.Fetch(dlr=>dlr.History)
.Future();
var daylogs=daylogQuery.ToList();
返回日志;
}
然而,我最终还是用代理来表示这种关系 在Testkey和ResultKey之间,即使我专门加载 这种关系

我认为整个问题可能代表了一个贫穷的国家 了解QueryOverAPI,所以我希望得到任何建议 关于它,但主要是,我想了解为什么我得到了一个代理,而不是 稍后我尝试获取结果时的结果列表 daylogresult.resultkey.testkey.results


有什么帮助吗

您必须在一个QueryOver子句中加载所有实体,以摆脱代理。但是在这种情况下,您的查询中将有很多连接,因此我建议在批处理中使用延迟加载。

答案是在各种对象上调用NHibernateUtil.Initialize。简单地把数据拉下来并不意味着NHibernate会使所有的代理水合