2014-04-18 53 views
0

我在我的過濾器中有3個變量: int? Owner,int? Watcher,int? CreatedByNHibernate組合和使用OR

現在,這取決於什麼是過濾器(if CreatedBy.HasValue等)進入,我想我的查詢NHibernate的使用OR語句組合。到目前爲止,我有

if (filter.Owner.HasValue) 
{ 
    criteria.Add(Expression.Disjunction() 
      .Add(Restrictions.Eq("ou.User.Id", filter.Owner.Value)) 
      .Add(Restrictions.Eq("ou.Status", 0))); 
} 

if (filter.Watcher.HasValue) 
{ 
    criteria.Add(Expression.Disjunction() 
      .Add(Restrictions.Eq("ou.User.Id", filter.Watcher.Value)) 
      .Add(Restrictions.Eq("ou.Status", 1))); 
} 

if (filter.CreatedBy.HasValue) 
{ 
    criteria.Add(Restrictions.Eq("u.Id", filter.CreatedBy)); 
} 

,我加createAlias等等......但是,如何將這些3個queryies在一個查詢與合併或根據篩選輸入變量?

回答

1

我會說,第一部分(你已經有)是可以的,第二個也是非常簡單的。 ,

// this would be the collector of criteria 
var restrictions = new List<ICriterion>(); 

if (filter.Owner.HasValue) 
{ 
    restrcitons.Add(Expression.Disjunction() 
     .Add(Restrictions.Eq("ou.User.Id", filter.Owner.Value)) 
     .Add(Restrictions.Eq("ou.Status", 0)) 
    ); 
} 

if (filter.Watcher.HasValue) 
{ 
    restricitons.Add(Expression.Disjunction() 
      .Add(Restrictions.Eq("ou.User.Id", filter.Watcher.Value)) 
      .Add(Restrictions.Eq("ou.Status", 1)) 
    ); 
} 

if (filter.CreatedBy.HasValue) 
{ 
    restrictions.Add(Restrictions.Eq("u.Id", filter.CreatedBy)); 
} 

// now we can inject the result of the above code into 
// Disjunction or Conjunction... 
if(restrictions.Count > 0) 
{ 
    var disjunction = Restrictions.Disjunction(); 
    restrictions .ForEach(r => disjunction.Add(r)); 
    criteria.Add(disjunction) 
} 

CreateAliasif內某處我 - 接近決策如果連接將被要求與否(基於搜索參數):怎樣的方式來處理,可能是。除非你在其他地方檢查。

也許嘗試將if進入的方法。他們可以採取restrictionscriteria並決定如何處理它們。它會是這樣

RestrictOwner (filter, restrictions, criteria); 
RestrictWatcher(filter, restrictions, criteria); 
RestrictCreator(filter, restrictions, criteria); 

if(restrictions.Count ... 

後來,他們可能甚至更通用...