2012-07-24 43 views
0

我們有一個允許用戶指定標準來查詢數據庫的表單。nHibernate動態查詢使用OR

我們的表單構建了用於構建nHibernate標準的「標準」對象。

我們當前的代碼來做到這一點:

public virtual ICriteria BuildCriteria(ICriteria criteria) 
{ 
    foreach (SheCriterion criterion in this.SheCriterions) 
    { 
     if (criterion.OperatorKey == "OR") 
     { 
      //// code required here to process ORs 
     } 
     criteria.Add(criterion.BuildCriterion()); 
    } 
    return criteria; 
} 

不幸的是,這就是我堅持的 - 如果我們的,並且每個標準是沒有問題的,但我在工作中的困難,出來怎麼加ORs - 當我們知道涉及OR時,之前的標準已經被處理。

任何人都可以幫忙嗎?

回答

2

or並不那麼容易。考慮a and b or c有兩種不同的可能性(a and b) or ca and (b or c)所以如果a = false你會得到兩個不同的答案。你必須建立審覈規定的樹和

public virtual ICriteria BuildCriteria(ICriteria criteria) 
{ 
    foreach (SheCriterion criterion in this.SheCriterions) 
    { 
     criteria.Add(criterion.BuildCriterion()); 
    } 

    return criteria; 
} 

public virtual ICriterion BuildCriterion() 
{ 
    if (OperatorKey == "OR") 
    { 
     return new Disjunction() 
      .Add(Left.BuildCriterion()) 
      .Add(right.BuildCriterion()); 
    } 
    else 
    { 
     return new Conjunction() 
      .Add(Left.BuildCriterion()) 
      .Add(right.BuildCriterion()); 
    } 
} 

更新:你需要一棵樹,否則

Man { Name = "Bill", Eyecolor = "blue", Height = 175, IsRich = true }; 

// will show Bill 
SELECT * FROM Men WHERE height > 180 AND eyecolor = blue OR IsRich = 1 
SELECT * FROM Men WHERE (height > 180 AND eyecolor = blue) OR IsRich = 1 

// will not show Bill 
SELECT * FROM Men WHERE height > 180 AND (eyecolor = blue OR IsRich = 1) 
+0

FIRO嗨, - 我不能得到這個代碼工作 - 是什麼在這裏左右? – Matt 2012-07-24 09:57:05

+0

您的SheCriterions必須是標準樹而不是標準列表。爲了說明,我介紹了一個具有左SheCriterion和右SheCriterion的假想SheOrCriterion。除此之外,你(和NHibernate)將無法知道將括號放在結果過濾器中的位置。 – Firo 2012-07-24 10:05:41

+0

感謝您的幫助 - 我在樹結構方面遇到困難。這裏的搜索顯示在c#中沒有任何標準的樹結構。 – Matt 2012-07-24 10:27:47