2016-11-23 3 views
0

Я пытаюсь выяснить, была ли загружена ленивая коллекция или нет, поэтому я знаю, включать ли ее в DTO. Ниже мой код.IsInitialized не работает с NHibernate LINQ

Контроллер

IEnumerable<Store> stores = StoreService.GetList(new int[] { 1, 2}, true); 

StoreDTO tStore = StoreService.GetDTO(stores.First()); 

StoreService

public IEnumerable<Store> GetList(int[] Ids, bool stockItems = false) 
    { 
     IQueryable<Store> stores = StoreRepository.GetList(Ids); 

     if (stockItems) 
      stores.Fetch(s => s.StockItems); 

     return stores.ToList(); 
    } 

public StoreDTO GetDTO(Store store) 
    { 
     StoreDTO storeDTO = Mapper.Map<Store, StoreDTO>(store); 

     bool itemsFetched = NHibernate.NHibernateUtil.IsInitialized(store.StockItems); 

     if(itemsFetched) { /** do stuff **/ } 

     return storeDTO; 
    } 

Проблема в itemsFetched всегда ложно, но если я ставлю точку останова на него, а затем использовать отладчик VS, чтобы посмотреть на StockItems а затем пусть точка прорыва через него возвращает true.

Означает ли это, что поставщик NHibernate LINQ поврежден или я что-то упустил?

Благодаря

+0

Можете ли вы разместить код для 'StoreRepository.GetList()'? –

ответ

2

Я предположил бы, что IsInitialized() возвращает ложь, потому что вы не применили выборки к IQueryable, что вы на самом деле выполняются. Попробуйте:

if (stockItems) 
    stores = stores.Fetch(s => s.StockItems); 

Во время/после отладки IsInitialized() возвращает истину, потому что сам отладчик вызовет ленивую нагрузку коллекции, когда вы исследуете объект.

+0

Это трюк, спасибо! – user2119597

Смежные вопросы