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