2009-10-19 3 views
1

У меня есть сопоставление NHibernate, установленное на ленивую загрузку = true. В моей CustomersViewModel у меня есть что-то вроде:ленивые загруженные коллекции NHibernate в ViewModels?

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

Это, очевидно, убивает всю отложенную загрузку, так как клиенты проходят один за другим.

Как получить мои коллекции (в том числе субколлекции и подкомпоны) a.s.f.) моделей-объектов в соответствующие ObservableCollections моих ViewModels для привязки к пользовательскому интерфейсу?

Это, как представляется, является общей проблемой, но я не нашел ответа, ни здесь, ни на Googles ...

ответ

3

Я не уверен, что я полностью понимаю вопрос. Но я думал, почему бы не изменить ваш метод GetCustomers к

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

Поскольку LINQ выражение лениво оценивало вы NHibernate коллекции обыкновения быть инициализированы до тех пор, его на самом деле не связан с пользовательским интерфейсом.

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 ключевое слово в присоединяется.

Смежные вопросы