Предварительная загрузка iUsertype со значениями из веб -сервиса
-
27-10-2019 - |
Вопрос
Эта почта:
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];
}