Extensões de lambda Nibernate - Ansiosos carregando as ascatiações de uma coleção
-
19-09-2019 - |
Pergunta
Eu tenho uma consulta de critérios para um site de redes sociais. Um objeto de pessoa tem uma coleção de amigos (também objetos de pessoa). A consulta pega os primeiros n amigos, mas também quero carregar um objeto associado MainProfileImage e, em seguida, um objeto associado subsequente Mediumthumbnail.
Eu posso fazer isso no HQL facilmente:
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
Aqui está o meu esforço de critério. Por alguma razão, isso não retorna nada!
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>();
}
Solução
Acredito que a ordem de suas declarações faz com que a consulta gere o SQL não desejado que você está obtendo (portanto, não há resultados). Aqui está como deve ser:
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>();
}
Além disso, por sua descrição, não está claro a partir de qual associação você deseja obter os dados do MaiorProfileImage e do MediumThumbnail. Enquanto você o está usando em sua declaração de critérios, você está pedindo que os dados venham do objeto principal de pessoa cujos amigos você está recebendo enquanto está usando o friendsAlias
. Eu mudei para usar o personAlias
em vez disso, como acredito, é onde você pretende associar os dados.