我的NHibernate映射设置为lazy loading = true。 在我的CustomersViewModel中,我有类似的东西:
foreach (Customer c in _customerRepository)
{
this.Customers.Add(new SingleCustomerViewModel(c));
}
这显然会导致所有延迟加载,因为客户是逐个传递的。
如何将我的模型对象的集合(包括子集和子集合a.s.f.)放入我的ViewModel的相应ObservableCollections中以绑定到UI?
这似乎是一个常见的问题,但我在这里和谷歌都没有找到答案......
答案 0 :(得分:3)
我不确定我完全理解这个问题。 但我在想为什么不将你的getCustomers方法更改为
IEnumerable<SingleCustomerViewModel> getCustomers(){
return from c in _customerRepository select SingleCustomerViewModel(c);
}
由于LINQ表达式被懒惰地评估,你的nhibernate集合在它实际绑定到UI之前不会被初始化。
答案 1 :(得分: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
关键字添加到您的联接中。