2009-11-11 52 views
0

我有一个社交网站的标准查询。 Person对象具有Friends(也是人物对象)的集合。查询抓取前N个朋友,但我也想要加载关联的对象MainProfileImage,然后加载后续的关联对象MediumThumbnail。NHibernate的Lambda扩展 - 渴望加载一个集合的assosciations

我可以在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>(); 
} 
+0

为什么不直接离开HQL呢? – 2009-11-11 23:55:49

回答

3

我相信你的语句的顺序会导致查询生成你想要的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声明中使用它时,您要求数据来自您在使用friendsAlias时获得的朋友的主Person对象。我已将其更改为使用personAlias,因为我相信这是您要关联数据的地方。

+0

完美的工作,谢谢!我确实必须将friendAlias换成personAlias--这是我无法控制自己头部的问题,但它工作正常!请更新您的答案以反映这一点。再次感谢! – reach4thelasers 2009-11-12 00:50:46

+0

更新了答案!为了让你的头脑混乱与别名尝试言语查询。我们在Criteria查询中说的是“让我的所有人对象与给定person对象的ID相同”,这意味着您将从给定person对象的friends集合中的元素开始查询。这就是为什么personAlias属于你的结果(给定的oerson对象的朋友)和friendsAlias对给定的人物对象。混淆也来自别名的不幸命名。 – tolism7 2009-11-12 01:47:51