NHibernate Lambda Extensions - Eager Загрузка ассоциаций коллекции - PullRequest
0 голосов
/ 12 ноября 2009

У меня есть критерий запроса для сайта социальной сети. Объект Person имеет коллекцию Friends (также объекты person). Запрос захватывает первых N друзей, но я также хочу загрузить связанный объект MainProfileImage, а затем последующий связанный объект MediumThumbnail.

Я могу легко сделать это на HQL:

select friends from Person person inner join person.Friends friends inner join fetch friends.MainProfileImage image inner join fetch image.MediumThumbnail where person = :person1 order by friends.LatestLogin desc

Вот мои усилия по критерию. По какой-то причине это ничего не возвращает!

public static IList<Person> GetFriends(Person person, int count)
{
    Person personAlias = null;
    Person friendAlias = null;

    ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
        .CreateCriteria(typeof (Person), () => personAlias)
        .CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
        .CreateCriteria(() => friendAlias.MainProfileImage, JoinType.InnerJoin)
        .CreateCriteria(() => friendAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
        .AddOrder(() => personAlias.LatestLogin, Order.Desc)
        .Add<Person>(p => p.ID == person.ID)
        .SetMaxResults(count);
    return criteria.List<Person>();
}

1 Ответ

3 голосов
/ 12 ноября 2009

Я считаю, что порядок ваших операторов заставляет запрос генерировать нежелательный SQL, который вы получаете (следовательно, никаких результатов). Вот как это должно быть:

public static IList<Person> GetFriends(Person person, int count)
{
    Person personAlias = null;
    Person friendAlias = null;

    ICriteria criteria = NHibernateSessionManager.Instance.GetSession()
        .CreateCriteria(typeof (Person), () => personAlias)
        .CreateCriteria(() => personAlias.Friends, () => friendAlias, JoinType.LeftOuterJoin)
        .Add<Person>(p => p.ID == person.ID)
        .CreateCriteria(() => personAlias.MainProfileImage, JoinType.InnerJoin)
        .CreateCriteria(() => personAlias.MainProfileImage.MediumThumbnail, JoinType.InnerJoin)
        .AddOrder(() => personAlias.LatestLogin, Order.Desc)
        .SetMaxResults(count);
    return criteria.List<Person>();
}

Кроме того, из вашего описания не ясно, из какой ассоциации вы хотите получить данные MainProfileImage и MediumThumbnail. Поскольку вы используете его в своем заявлении о критериях, вы запрашиваете данные из основного объекта Person, друзей которого вы получаете, когда используете friendsAlias. Я изменил его на использование personAlias вместо этого, так как считаю, что именно здесь вы хотите связать данные.

...