Предварительная загрузка iUsertype со значениями из веб -сервиса

StackOverflow https://stackoverflow.com/questions/7322874

Вопрос

Эта почта:

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

Описывает, как загрузить объект из ресурса, отличного от базы данных, в данном случае веб -сервис. Это здорово, но если я загружаю несколько клиентов в один запрос, каждый с различным Maritialstate, ему придется позвонить в веб -сервис для каждого клиента. Есть ли способ предварительно загружать все супружеские состояния, поэтому он не должен возвращаться в сторону веб -сервиса для каждого клиента?

Это было полезно?

Решение

Я не думаю, что Hibernate поддерживает это. 'n+1 выберите проблему' это хорошо известная проблема, и Hibernate имеет немало стратегий для борьбы с ней (партия, подэлексы, стремление и т. Д.). Проблема в том, что у вас есть «N+1 веб -сервисная вызов», и все эти механизмы бесполезны. 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