NHibernate的LAMBDA扩展 - 预先加载一个收藏协会
-
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数据,关联明确。当你在你的条件语句中使用它,你问的数据来自于主Person对象,其朋友你正在为你使用的是friendsAlias
。我已经改变了它使用personAlias
,而不是因为我相信这是你的意思是将数据从相关联。
不隶属于 StackOverflow