#c# #nhibernate #queryover
#c# #nhibernate #выполнение запросов
Вопрос:
У меня есть классы
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 может быть много комментариев.
Я хотел бы получить коллекцию всех записей в блоге, где последний комментарий (это с MAX (DateAdde) с TypeId = 1 или TypeId = 2. Заранее спасибо.
Ответ №1:
Я сделал все возможное, чтобы перенести структуру вашего класса в запрос, который я делаю примерно в том же духе. Моя была после 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...
Ответ №2:
Используете ли вы LINQ с NHibernate? Как насчет чего-то подобного?
blogPosts.Where(x => x.Comments.Last().TypeId == 1 || x.Comments.Last().TypeId == 2);
Я не уверен, поддерживает ли Nhibernate вложенные запросы (многие ORM этого не делают), однако вы, возможно, захотите попробовать это.
Комментарии:
1. К сожалению, я не использую Linq для Nhibernate, потому что в NH3 этот поставщик еще не полностью реализован (я часто получаю ошибки «Не реализовано») — поэтому я использую QueryOver, как я писал в теме.