2011-03-05 51 views
2

我想OR-組合兩個限制,一個與父項有關,一個與子項有關。NHibernate QueryOver:限制加入的分解

我有以下代碼:

var query = Session.QueryOver<Project>() 
      .Where(x => x.AccountId == Scope.AccountId) 
      .And(x => x.Archived != active) 
      .AndRestrictionOn(x => x.Name).IsLike("%" + text + "%") 
      .JoinQueryOver(x => x.Customer) 
       .WhereRestrictionOn(c => c.Name).IsLike("%" + text + "%") 
      .OrderBy(x => x.Id).Desc 
      .Fetch(x => x.Customer).Eager; 

SQL輸出:

SELECT this_.Id    as Id2_1_, 
     this_.Account_id  as Account2_2_1_, 
     this_.Name   as Name2_1_, 
     this_.Info   as Info2_1_, 
     this_.Archived  as Archived2_1_, 
     this_.Customer_id  as Customer6_2_1_, 
     customer1_.Id   as Id1_0_, 
     customer1_.Account_id as Account2_1_0_, 
     customer1_.Name  as Name1_0_ 
FROM  [Project] this_ 
     inner join [Customer] customer1_ 
      on this_.Customer_id = customer1_.Id 
WHERE this_.Account_id = 5 /* @p0 */ 
     and not (this_.Archived = 1 /* @p1 */) 
     and this_.Name like '%dim%' /* @p2 */ 
     and customer1_.Name like '%dim%' /* @p3 */ 
ORDER BY customer1_.Id desc 

不幸的是,這兩個限制之間的AND-一起選擇:

this_.Name like '%dim%' and customer1_.Name like '%dim%' 

我會喜歡有OR,就像這樣:

this_.Name like '%dim%' or customer1_.Name like '%dim%' 

如何使用新的QueryOver API解決此查詢?

回答

3

您需要使用別名。

完整的查詢應該是:

Customer customerAlias = null; 

/* 1st - create base query */ 
var query = Session.QueryOver<Project>() 
      .JoinAlias(x => x.Customer,() => customerAlias) 
      .Where(x => x.AccountId == Scope.AccountId) 
      .Where(x => x.Archived != active); 

/* 2nd - create the disjunction */ 
var disjunction = new Disjunction(); 

disjunction.Add(Restrictions.On<Project>(p => p.Name).IsLike(text, MatchMode.Anywhere)); 
disjunction.Add(Restrictions.On(() => customerAlias.Name).IsLike(text, MatchMode.Anywhere)); 

/* 3rd - complete query */ 
query = query.Where(disjunction)     
      .OrderBy(x => x.Id).Desc;