2009-07-29 25 views
0

我正在將一個項目與v2.1相當嵌入的項目(即我們不會將其切換到v3)重新開始進入SubSonic。SubSonic 2.1的嵌套OR語句

我翻閱了一堆方法參數來構建一個長而不是過於複雜的查詢。在此查詢的末尾,我需要補充的是增加了一組OR語句,東西相當於一個聲明:

...AND ((DateColumn BETWEEN @StartDate1 AND @EndDate1) OR (DateColumn BETWEEN StartDate2 AND @EndDate2)) 

現在我有:

if (criteria.TaxCreditApprovalYear != null && criteria.TaxCreditApprovalYear.Count > 0) 
{ 
    criteria.TaxCreditApprovalYear.ForEach(year => qry.And(Property_Overview.Columns.EffectiveDate) 
                 .IsBetweenAnd(new DateTime(year, 01, 01), 
                    new DateTime(year, 12, 31))); 
} 

這是給我一堆和聲明。我知道一個Or或OrExpression需要讓它在那裏,但我一直無法找到在哪裏或如何放入。

有什麼想法?我對任何能夠獲得適當查詢的東西都是開放的,這種查詢不會覆蓋可能存在或可能不存在的其他現有AND語句。

回答

2

好的,我明白了。這是使用AndExpression()而不是And()的問題。我必須用條件的第一個實例初始化AndExpression,然後循環訪問剩餘的條件並用Or()附加它們。

// NOTE: Is it just me or does this smell a little? 
if (criteria.TaxCreditApprovalYear != null && criteria.TaxCreditApprovalYear.Count > 0) 
{ 

    qry.AndExpression(Property_Overview.Columns.EffectiveDate) 
     .IsBetweenAnd(new DateTime(criteria.TaxCreditApprovalYear[0], 01, 01), new DateTime(criteria.TaxCreditApprovalYear[0], 12, 31)); 

    // skip over the first index since we already set that up above in the AndExpression. 
    for (int i = 1; i < criteria.TaxCreditApprovalYear.Count; i++) 
    { 
     qry.Or(Property_Overview.Columns.EffectiveDate) 
      .IsBetweenAnd(new DateTime(criteria.TaxCreditApprovalYear[i], 01, 01), new DateTime(criteria.TaxCreditApprovalYear[i], 12, 31)); 
    } 
} 
0

您可以將其分解爲幾個查詢,每個查詢一個「OR」語句。

即:

if (criteria.TaxCreditApprovalYear != null && criteria.TaxCreditApprovalYear.Count > 0) 
{ 
    Query qry1 = qry.And(Property_Overview.Columns.EffectiveDate) 
      .IsBetweenAnd(new DateTime(year, 01, 01), new DateTime(year, 12, 31))); 
    Query qry2 = qry.And(Property_Overview.Columns.EffectiveDate) 
      .IsBetweenAnd(StartDate2, EndDate2)); 
    Query qry3 = qry.And(Property_Overview.Columns.EffectiveDate) 
      .IsBetweenAnd(StartDate3, EndDate3)); 


    criteria.TaxCreditApprovalYear.ForEach(year => qry1); 
    criteria.TaxCreditApprovalYear.ForEach(year => qry2); 
    criteria.TaxCreditApprovalYear.ForEach(year => qry3); 
} 

(我還沒有運行上面的代碼,所以認爲這是僞代碼,不要你還需要一個qry.ExecuteScalar()或東西??)

+0

yah,代碼中的執行更低。這個問題沒有必要。 – nkirkes 2009-07-29 17:45:20

0

有query.OpenExpression()和query.CloseExpression()手動創建一個打開和關閉的parens,但我不知道如何將這些添加到現有的一組標準的末尾。