2009-10-19 52 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关键字到您的加入。