NHibernate Eager使用Queryover API加载复杂的对象图

时间:2011-05-20 21:24:04

标签: nhibernate queryover

我有一个非常复杂的对象图,我想一次加载 俯冲。

示例包含日志,其日志测试具有Daylog 结果

Daylog测试有Testkeys,Daylog结果有Resultkeys,和 TestKeys有Resultkeys。

我正在使用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;
                }

但是,我仍然最终代表了这种关系 在Testkey和ResultKey之间,即使我是专门加载的 这种关系。

我认为整个查询可能代表了穷人 了解QueryOver API,所以我想要任何和所有的建议 在它上面,但主要是,我想了解为什么我得到代理而不是 稍后我试图得到的结果列表 daylogresult.resultkey.testkey.results。

有任何帮助吗?

2 个答案:

答案 0 :(得分:5)

答案是在各种对象上调用NHibernateUtil.Initialize。简单地拉下数据并不意味着NHibernate会为所有代理提供水分。

答案 1 :(得分:0)

您必须在一个QueryOver子句中加载所有实体才能删除代理。但在这种情况下,您的查询中会有很多连接,所以我建议使用延迟加载和批处理。