2011-09-19 24 views
4

我有一個Show實體與子導航IList<TicketRequest>。使用QueryOver,我想選擇所有設置了活動標誌的Show實體,並且還選擇在將來空氣並且具有關聯的實體的Show。正在運行的SQL查詢是:NHibernate使用QueryOver:WHERE和EXISTS

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) 

任何人都可以找出如何一路過關斬將,包括額外的WHERE條件?任何幫助,將不勝感激。

回答

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

這奏效了!謝謝。 – ronny97