NHibernate с использованием QueryOver: ГДЕ и СУЩЕСТВУЕТ - PullRequest
4 голосов
/ 20 сентября 2011

У меня есть Show сущность с дочерней навигацией IList<TicketRequest>. Используя QueryOver, я хотел бы выбрать все Show сущности, для которых установлен флаг Active, а также выбрать Show s, которые будут транслироваться в будущем и с которыми связаны TicketRequest сущности. Рабочий SQL-запрос:

select s.*
from Show s
where s.Active = 1 or
    (s.ShowDate > getdate() and exists(
     select 1
     from TicketRequest tr
     where tr.Show_id = s.Id))

Я не могу понять, как заставить это работать, используя QueryOver. Я могу добраться на полпути с:

Show showAlias = null;

var existing = QueryOver.Of<TicketRequest>()
        .Where(r => r.Show.Id == showAlias.Id)
        .Select(r => r.Show);

var results = Session.QueryOver<Show>(() => showAlias)
        .Where(s => s.ShowDate > DateTime.Now)
        .WithSubquery.WhereExists(existing)
        .List();

, который по сути производит SQL:

select s.*
from Show s
where s.ShowDate > getdate() and exists(
     select 1
     from TicketRequest tr
     where tr.Show_id = s.Id)

Может кто-нибудь понять, как пройти весь путь и включить дополнительные условия ГДЕ? Любая помощь будет оценена.

1 Ответ

6 голосов
/ 20 сентября 2011

немного многословно, но должно сделать

var results = session.QueryOver<User>(() => showAlias)
    .Where(Restrictions.Or(
        Restrictions.Where<Show>(s => s.Active),
        Restrictions.And(
            Restrictions.Where<Show>(s => s.ShowDate > DateTime.Now),
            Subqueries.WhereExists(existing))))
    .List();
...