Question

Ce message:

http://kennytordeur.blogspot.com/2011/ 04 / NHibernate en combinaison with_06.html

Décrit comment charger une entité d'une ressource autre qu'une base de données, dans ce cas, un webservice. Cela tombe bien, mais si je charge un certain nombre de clients dans une requête, chacun avec un MaritialState différent, il devra appeler le webservice pour chaque client. Est-il possible de précharger tous les états matrimoniaux, il ne doit pas aller et venir au WebService pour chaque client?

Était-ce utile?

La solution

Je ne pense pas que ce Hibernate supporte. « n + 1 problème select » est un bien connaître question et Hibernate a tout à fait quelques stratégies pour y faire face (lots, les sous-requêtes, le chargement complet, etc.). Le problème est que vous avez « n + 1 appel de service Web » et tous ces mécanismes sont inutiles. Mise en veille prolongée ne sait tout simplement pas ce que vous faites dans IUserType. Il suppose que vous convertir les données déjà chargées.

Il semble que vous devrez mettre en œuvre votre propre préchargement. Quelque chose comme ceci:

// 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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top