延迟加载NHibernate集合到ViewModels?

时间:2009-10-19 15:06:02

标签: c# nhibernate collections mvvm

我的NHibernate映射设置为lazy loading = true。 在我的CustomersViewModel中,我有类似的东西:

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

这显然会导致所有延迟加载,因为客户是逐个传递的。

如何将我的模型对象的集合(包括子集和子集合a.s.f.)放入我的ViewModel的相应ObservableCollections中以绑定到UI?

这似乎是一个常见的问题,但我在这里和谷歌都没有找到答案......

2 个答案:

答案 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关键字添加到您的联接中。

相关问题