1

オブジェクトのコレクションを効率的にロードしたい。次のコードサンプルは、私が現在行っていることを示しています。ただし、c.CommunicationMethodsおよびc.Rolesオブジェクトには、一度に1つのSqlステートメントがロードされます。バッグとバッチサイズへの参照を見ました...誰かがサンプルマッピングファイル参照を提供できますか?それが私の最善の選択肢ですか?ここでループを維持し、SQLステートメントをバッチ処理できますか?

CommunicationMethodsとRolesはどちらも、連絡先マッピングファイルで多対1として定義されています。

NHibernateUtil.Initialize(entity.Collection1);
NHibernateUtil.Initialize(entity.Collection2);

NHibernateUtil.Initialize(entity.Contacts);
foreach (var c in entity.Contacts)
{
NHibernateUtil.Initialize(c.CommunicationMethods);
NHibernateUtil.Initialize(c.Roles);
}
4

1 に答える 1

4

Initialize の代わりに、クエリ中に初期化するコレクションを指定でき、マルチクエリを使用するとデカルト積を小さく保つことができます。

// load all collection1 into cache
session.QueryOver<Entity>()
    .Where(filter)
    .Fetch(e => e.Collection1).Eager
    .Future();

// load all collection2 into cache
session.QueryOver<Entity>()
    .Where(filter)
    .Fetch(e => e.Collection2).Eager
    .Future();

var results = session.QueryOver<Entity>()
    .Where(filter)
    .Fetch(e => e.Contacts).Eager
    .Fetch(e => e.Contacts.CommunicationMethods).Eager
    .Fetch(e => e.Contacts.Roles).Eager
    .List();

// results contain all entities with initialised collection1, collection2, contacts, contact.role, contact.CommunicationMethod
于 2012-07-13T14:08:01.153 に答える