代码之家  ›  专栏  ›  技术社区  ›  reach4thelasers

NHibernate lambdas联合订购系列

  •  0
  • reach4thelasers  · 技术社区  · 15 年前

    我有一个实体“人”,一个人有一个朋友的集合(也是个人实体)

    我要找一个特定的人的前10个朋友,由最新的登录人员订购。

    我最大的努力是:

        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)
                .AddOrder(() => friendAlias.LatestLogin, Order.Desc)
                .Add<Person>(p => p.ID == person.ID)
                .SetMaxResults(count);
            return criteria.List<Person>();
        }
    

    它确实能抓住所有用户的朋友,但是他们不是由最新的登录人员来订购的。有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   tolism7    15 年前

    我知道这听起来很奇怪,但解决方法是改变路线:

    .AddOrder(() => friendAlias.LatestLogin, Order.Desc)
    

    用:

    .AddOrder(() => personAlias.LatestLogin, Order.Desc)
    

    你必须从另一个角度来看待它,以便理解为什么这是必要的,而不是在开始时就不明显。

    您请求的个人对象(PersonalAs)与id==person.id(.add(p=>p.id==person.id))具有相同的“父”朋友(friendAlias),因此需要按personalas.latestlogin而不是friendAlias.latestlogin排序。