NHibernate Lambda Estensioni - il caricamento di una collezioni associazioni Eager
-
19-09-2019 - |
Domanda
Ho una query Criteri per un sito di social networking. Un oggetto Person ha una collezione di amici (anche oggetti persona). La query afferra i primi N amici, ma voglio anche carico desiderosi di un MainProfileImage oggetto associato e poi una successiva oggetto associato MediumThumbnail.
posso fare questo in 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
Ecco il mio sforzo criteri. Per qualche motivo questo non restituisce nulla!
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>();
}
Soluzione
Credo che l'ordine delle sue dichiarazioni causa la query per generare il codice SQL non desiderato che si stanno ottenendo (quindi nessun risultato). Ecco come dovrebbe essere:
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>();
}
Inoltre dalla tua descrizione non è chiaro da cui l'associazione si desidera ottenere i dati MainProfileImage e MediumThumbnail da. Come lo si utilizza nella sua dichiarazione Criteri si sta chiedendo i dati a venire dall'oggetto principale persona di cui gli amici si stanno ottenendo come si utilizza il friendsAlias
. Ho cambiato in modo da utilizzare la personAlias
invece come credo che questo è dove si intende associare i dati.