7

一気にロードしたいかなり複雑なオブジェクト グラフがあります。

サンプルには、デイログ結果を持つデイログ テストを持つデイログがあります。

Daylog テストには Testkeys があり、Daylog Results には Resultkeys があり、TestKeys には Resultkeys があります。

QueryOver API と Future を使用して、これらすべてを 1 つのクエリとして実行しています。グラフ全体をインスタンス化するために 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 を取得しようとしています。

何か助けはありますか?

4

2 に答える 2

5

答えは、さまざまなオブジェクトで NHibernateUtil.Initialize を呼び出すことでした。単純にデータを取得しても、NHibernate がすべてのプロキシをハイドレートするわけではありません。

于 2011-07-07T16:43:44.100 に答える
0

プロキシを取り除くには、すべてのエンティティを 1 つの QueryOver 句にロードする必要があります。ただし、この場合、クエリに多数の結合が含まれるため、バッチ処理で遅延読み込みを使用することをお勧めします。

于 2011-05-21T08:35:27.123 に答える