Nhibernate - загрузка объекта с коллекцией HasMany в веб-приложении

Во-первых, кто-то еще пытается попасть на forum.hibernate.org. Я пытался какое-то время. Не могу поверить, что он упал.

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

У меня есть приложение MVC, и у меня есть объект под названием Recipe, и у него есть коллекции 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 рецептов с загруженными изображениями ??? Я СТРЕМЯСЬ. Я хочу предварительно загружать изображения, а не ленивую загрузку, потому что список загружается в действие контроллера, поэтому изображения не могут быть загружены, когда я перечисляю их в своем пользовательском элементе управления.

Малькольм


person Malcolm    schedule 03.05.2009    source источник


Ответы (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>();
person Darin Dimitrov    schedule 03.05.2009
comment
Вы уверены, что это работает? Бьюсь об заклад, это не так. Это объединения, которые не позволяют правильно подсчитывать строки. (Хотя я не знаю решения.) - person Rashack; 03.05.2009
comment
Дублированные строки берутся из левого соединения. NHibernate использует первичный ключ модели Recipe для фильтрации повторяющихся строк, когда установлен преобразователь DistinctRootEntity. Однако имейте в виду, что фильтрация выполняется в памяти после выборки строк, а не на уровне базы данных. - person Darin Dimitrov; 03.05.2009