Расширения NHibernate Lambda – Eager Загрузка ассоциаций коллекции
-
19-09-2019 - |
Вопрос
У меня есть запрос по критериям для сайта социальной сети.Объект 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>();
}
Решение
Я считаю, что порядок ваших операторов приводит к тому, что запрос генерирует нежелательный 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.Поскольку вы используете его в своем заявлении Criteria, вы запрашиваете данные из основного объекта Person, друзей которого вы получаете, используя friendsAlias
.Я изменил его, чтобы использовать personAlias
вместо этого, поскольку я считаю, что именно здесь вы имеете в виду связать данные.