Справка QueryOver по JoinAlias ​​и фильтрация подзапросов

Например, представьте, что у вас есть объект «Публикация», в котором есть «Комментарии» (один ко многим), и вы хотите иметь модель представления с сущностью «Публикация» и самым последним комментарием:

PostViewModel {Id, Title, Body, Date, LastComment (type:CommentEntity)}

Я могу сделать это в простом sql, например:

SELECT TOP 10 *
FROM Posts
 INNER JOIN Comments ON Comments.PostID = Posts.PostID
WHERE Comments.[Date] = 
 (SELECT MAX(c.[Date]) FROM Comments AS c WHERE c.PostID = Posts.PostID GROUP BY c.PostID)

Как я могу сделать этот же запрос в nhibernate 3, используя QueryOver?

Я пробовал с подзапросами, но я могу получить только один результат, а не список 10 лучших.


person Ricardo    schedule 01.09.2011    source источник


Ответы (2)


Вы можете попробовать использовать коллекцию фильтры, чтобы получить самый последний комментарий к сообщению:

var posts = session.CreateCriteria<Post>()
    .SetMaxResults(10)
    .List<Post>();

foreach (Post post in posts) {

    Comment lastComment = session.CreateFilter(post.Comments, 
                                               "order by this.Date desc")
        .SetFirstResult(0)
        .SetMaxResults(1)
        .List()
        .FirstOrDefault();

    new PostViewModel  {
        Id = post.Id,
        Title = post.Title,
        LastComment = lastComment
    };
}
person Dmitry    schedule 01.09.2011

Я пытался решить ваш вопрос, но пока не могу попробовать свой код.

Comments coms = null;
Post pst = null;

var qOverInclude = QueryOver.Of<Comments>(() => coms)
     .Select(Projections.Max(coms.Date)
      , Projections.Group(()=>coms.PostID));

var qOver = _HibSession.QueryOver<Post>(() => pst)
      .JoinAlias(() => pst.Comments, () => coms, JoinType.LeftOuterJoin)
      .WithSubquery.WhereProperty(() => coms.Date).In(qOverInclude)
      .Take(10)
      .List<Post>();

Я надеюсь, что это полезно.

person Faber    schedule 02.09.2011