Pregunta

Esta publicación:

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

Describe cómo cargar una entidad de un recurso que no sea una base de datos, en este caso un servicio web. Esto es excelente, pero si cargo varios clientes en una consulta, cada uno con un MaritialState diferente, tendrá que llamar al servicio web para cada cliente. ¿Hay alguna manera de precargar todos los estados matrimoniales, por lo que no tiene que ir y venir al servicio web para cada cliente?

¿Fue útil?

Solución

No creo que Hibernate admita esto. 'n+1 seleccionar problema' es un problema bien conocido y Hibernate tiene bastantes estrategias para tratarlo (lotes, subselects, ansiadores de búsqueda, etc.). El problema es que tiene 'N+1 Call Web Service' y todos estos mecanismos son inútiles. Hibernate simplemente no sabe lo que estás haciendo en IUSERTYPE. Se supone que convierte los datos ya cargados.

Parece que tendrá que implementar su propia precarga. Algo como esto:

// 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];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top