質問

この郵便受け:

http://kennytordeur.blogspot.com/2011/04/nhibernate-in-combination-with_06.html

データベース以外のリソースからエンティティをロードする方法について説明します。この場合、ウェブサービス。これは素晴らしいことですが、1つのクエリに多くのクライアントをロードすると、それぞれが異なる海兵材を持つ場合、各クライアントのWebサービスを呼び出す必要があります。すべての結婚状態をプリロードする方法はありますか?各クライアントのウェブサービスに行き来する必要はありませんか?

役に立ちましたか?

解決

Hibernateがこれをサポートしているとは思わない。 'n+1問題問題」 よく知っている問題であり、Hibernateにはそれを扱うためのかなりの数の戦略があります(バッチ、サブセレクト、熱心なフェッチなど)。問題は、「N+1 Webサービスコール」があり、これらのメカニズムはすべて役に立たないことです。 Hibernateは、IUSERTYPEで何をしているのかを単に知りません。既にロードされたデータを変換することを前提としています。

独自のプリロードを実装する必要があるようです。このようなもの:

// TODO: not thread safe, lock or use ConcurrentDictionary
static IDictionary<Int32, ClientDto> _preLoadedClients
                                            = new IDictionary<int,ClientDto>();

public Object NullSafeGet(IDataReader rs, String[] names, ...) {

    Int32 clientid = NHibernateUtil.Int32.NullSafeGet(rs, names[0]);

    // see if client has already been preloaded:
    if(_preLoadedClients.ContainsKey(clientid)) {
        return _preLoadedClients[clientid];
    }

    // load a batch: clientId + 1, client + 2, ... client + 100
    var batchOfIds = Enumerable.Range(clientid, 100);
    var clientsBatch = clientService.GetClientsByIds(batchOfIds);

    _preLoadedClients.Add(clientsBatch);

    return _preLoadedClients[clientid];
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top