NHibernate使用QueryOver:WHERE和EXISTS

时间:2011-09-19 20:24:52

标签: .net nhibernate queryover

我有一个带有子导航Show的{​​{1}}实体。使用IList<TicketRequest>,我想选择所有设置了Active标记的QueryOver个实体,并选择Show s将来播出并且有相关Show实体的实体。一个有效的SQL查询是:

TicketRequest

我无法弄清楚如何使用QueryOver来完成这项工作。我可以到达那里:

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))

基本上产生SQL:

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();

任何人都可以知道如何一路走下去并包含额外的WHERE条件吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

有点冗长,但应该做

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();