2009-07-29 4 views
0

v2.1がかなり埋め込まれているプロジェクトでSubSonicに頭を下ろしています(つまり、v3に切り替えることはありません)。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))); 
} 

私はAND声明の束。私はOrまたはOrExpressionがその中に入る必要があることを知っていますが、それをどこに落とすかを追跡することができませんでした。

何か考えていますか?私は、すでに存在するかもしれないし、存在していないかもしれない他の既存のANDステートメントをオーバーライドしない適切なクエリを得ることができる何かを開いています。

答えて

2

大丈夫、私はそれを得た。これは、And()の代わりにAndExpression()を使用する問題です。私は基準の最初のインスタンスで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」ステートメントごとに1つずつ、いくつかのクエリに分解することができます。

すなわち:

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

+0

大文字の親クエリにクエリがどのようにアタッチされるのか分かりません。 – nkirkes

0

開いている括弧を手動で作成するためのquery.OpenExpression()とquery.CloseExpression()がありますが、それらを既存の条件セットの末尾に追加する方法はわかりません。