2009-07-29 5 views
0

v2.1이 포함 된 프로젝트에서 SubSonic으로 되돌아갑니다. 즉, v3으로 바꾸지 않습니다.SubSonic 2.1이 포함 된 중첩 된 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"문에 대해 하나씩 두 개의 쿼리로 구분할 수 있습니다.

예 :

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

예, 코드의 실행이 더 낮습니다. 그 질문에는 필요하지 않았다. – nkirkes

+0

큰 쿼리, 상위 쿼리에 쿼리가 어떻게 첨부되는지 알지 못합니다. – nkirkes

0

query.OpenExpression() 및 query.CloseExpression()을 사용하여 수동으로 열고 닫는 괄호를 만들지 만 기존 기준 집합의 끝에 추가하는 방법을 알지 못합니다.