Frage

Dieser Beitrag:

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

Beschreibt, wie ein Entität aus einer anderen Ressource als einer Datenbank geladen wird, in diesem Fall ein Webservice. Dies ist großartig, aber wenn ich eine Reihe von Clients in einer Abfrage lade, die jeweils einen anderen maritialen State haben, muss er den Webservice für jeden Kunden anrufen. Gibt es eine Möglichkeit, alle ehelichen Zustände vorzuladen, daher muss es nicht zum Webservice für jeden Kunden hin und her gehen?

War es hilfreich?

Lösung

Ich glaube nicht, dass Hibernate dies unterstützt. 'n+1 Problem auswählen' ist ein gut bekanntes Problem und Hibernate hat einige Strategien für den Umgang damit (Chargen, Unterauswahl, eifriges Abrufen usw.). Das Problem ist, dass Sie 'N+1 Web Service Call' haben und all diese Mechanismen nutzlos sind. Hibernate weiß einfach nicht, was Sie in iUSertype tun. Es wird davon ausgegangen, dass Sie bereits geladene Daten konvertieren.

Es sieht so aus, als müssten Sie Ihr eigenes Vorladen implementieren. Etwas wie das:

// 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];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top