Подборка NHibernate QueryOver с использованием Max - PullRequest
4 голосов
/ 15 мая 2011

У меня есть классы

public class BlogPost
{
    public int Id {get;set;}
    public string Body{get;set;}
    public IList<Comment> Comments{get;set;}
    //other properties
}

public class Comment
{
    public int Id {get;set;}
    public int TypeId {get;set;}
    public int BlogPostId {get;set;}
    public DateTime DateAdd {get;set;}
    public string Body {get;set;}
    //other properties
}

Итак, у нас есть некоторая коллекция BlogPost, где каждый BlogPost может иметь много комментариев.

Я хотел бы получить коллекцию всех BlogPost, где последний комментарий (этотс MAX (DateAdde) с TypeId = 1 или TypeId = 2. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Я приложил все усилия, чтобы преобразовать вашу структуру классов в запрос, который я выполняю в том же духе.Мой был после 1 родителя с критериями, у которых есть ребенок, где у самого нового ребенка были специальные критерии.Я удалил родительские критерии и применил вашу структуру классов, поэтому она должна быть близкой, но не проверенной.

var query = session.QueryOver<BlogPost>(); //get queryover however you implemented
BlogPost bp = null;
Comment c = null;

var q = QueryOver.Of<BlogPost>(() => bp)
    .JoinAlias(() => bp.Comments, () => c)
    .SelectList(list => list.SelectMax(() => c.DateAdd));

query.JoinQueryOver<Comment>(x => x.Comments)
    .WithSubquery
    .WhereProperty(x => x.DateAdd).Eq(q)
    .Where(x => x.TypeId == 1 || x.TypeId == 2);

     query.List...
1 голос
/ 15 мая 2011

Используете ли вы LINQ с NHibernate? Как насчет этого?

blogPosts.Where(x => x.Comments.Last().TypeId == 1 || x.Comments.Last().TypeId == 2);

Я не уверен, поддерживает ли Nhibernate вложенные запросы (многие ORM не поддерживают), однако вы можете попробовать это.

...