IsInitialized不能与NHibernate LINQ一起使用

时间:2016-11-23 09:52:38

标签: c# linq nhibernate lazy-loading linq-to-nhibernate

我试图弄清楚是否已经加载了一个懒惰的集合,所以我知道是否要将它包含在DTO中。以下是我的代码。

控制器

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提供程序已损坏或我在这里遗漏了什么?

由于

1 个答案:

答案 0 :(得分:2)

我猜想IsInitialized()会返回false,因为你没有将fetch应用到你实际执行的IQueryable。尝试:

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

在调试期间/之后,IsInitialized()返回true,因为在浏览对象时调试器本身将触发集合的延迟加载。