Справка по QueryOver на JoinAlias ​​и фильтрация в подзапросах - PullRequest
1 голос
/ 01 сентября 2011

Например, представьте, что у вас есть объект 'Post', у которого есть 'Comments' (один ко многим), и вы хотите иметь модель представления с сущностью Post и самым последним комментарием:

PostViewModel {Id, Title, Body, Date, LastComment (тип: 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)

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

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

Ответы [ 2 ]

0 голосов
/ 02 сентября 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>();

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

0 голосов
/ 02 сентября 2011

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

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
    };
}
...