2009-05-03 14 views
2

Сначала кто-нибудь еще пытается попасть на forum.hibernate.org. Я пытался какое-то время. Не могу поверить в это.Nhibernate - Загрузка объекта с помощью коллекции HasMany в веб-приложении

Я новичок в NHibernate. Полегче.

У меня есть приложение MVC, и у меня есть объект, называемый Рецепт , и у него есть коллекции HasMany. Комментарии, Компоненты и изображения.

В действии контроллера MVC я загружаю первые 20 рецептов для загрузки на моей домашней странице.

Я использую следующий HQL для этого. Я хочу предварительно выбрать изображения , чтобы я мог отобразить первый. Но мой первый рецепт имеет 3 изображения, поэтому результат запроса состоит из 3 строк, загруженных для одного рецепта.

 string sql = "from Recipe r " + 
      "left join fetch r.Images " + 
      "inner join fetch r.User " + 
      "where r.Completed!=0"; 
     IList<Recipe> recipes = (IList<Recipe>)session.CreateQuery(sql) 
      .SetMaxResults(20) 
      .List<Recipe>(); 

Какой метод я использую для загрузки первых 20 рецептов с загруженными изображениями ??? I STRESS Я хочу, чтобы предварительная выборка изображений не была ленивой, это потому, что список загружается в действие контроллера, поэтому изображения не могут быть загружены, когда я перечисляю их в своем пользовательском элементе управления.

Malcolm

ответ

1

Попробуйте это:

string sql = "from Recipe r " + 
     "left join fetch r.Images " + 
     "inner join fetch r.User " + 
     "where r.Completed!=0"; 

var recipes = session 
    .CreateQuery(sql) 
    .SetResultTransformer(CriteriaUtil.DistinctRootEntity) 
    .SetMaxResults(20) 
    .List<Recipe>(); 
+0

Вы уверены, что это работает? Держу пари, что нет. Это соединения, которые не позволят правильно подсчитать количество строк. (Я не знаю решение, хотя.) – Rashack

+0

Это действительно работает. Благодаря! – Malcolm

+0

Дублированные строки поступают из левого соединения. NHibernate использует первичный ключ модели Рецепт для фильтрации повторяющихся строк при установке трансформатора DistinctRootEntity. Имейте в виду, что фильтрация выполняется в памяти после того, как строки извлекаются, а не на уровне базы данных. –