2009-10-19 53 views
1

我有我的NHibernate映射設置爲延遲加載= true。 在我CustomersViewModel我有類似:懶加載到ViewModels的NHibernate集合?

 foreach (Customer c in _customerRepository) 
     { 
      this.Customers.Add(new SingleCustomerViewModel(c)); 
     } 

這顯然殺死所有的延遲加載,因爲客戶是通過一個傳遞的一個。

如何將模型對象的集合(包括子集合和子子集合a.s.f)包含到我的ViewModel的相應ObservableCollections中以綁定到UI?

這似乎是一個常見的問題,但是我發現沒有答案,非驢非馬的谷歌......

回答

3

我不知道我完全理解這個問題。 但我在想,爲什麼你GetCustomers的方法沒有改變

IEnumerable<SingleCustomerViewModel> getCustomers(){ 
    return from c in _customerRepository select SingleCustomerViewModel(c); 
    } 

由於LINQ表達式懶洋洋地評估你的NHibernate集合不會被初始化,直到它實際上綁定到UI。

0

這是一個經典的「SELECT N + 1」問題:無論您用於NHibernate的查詢層如何,都可以在初始查詢中熱切加載子集合以避免逐行查詢模式。

隨着LINQ提供程序,例如:

session.Query<Customer>() 
     .FetchMany (c => c.Widgets) // eagerly load child collections 
     .ThenFetchMany (w => w.Frobbers); // now get grandchild collection 

如果您使用HQL,只需添加fetch關鍵字到您的加入。