Вложенные операторы OR с SubSonic 2.1 - PullRequest
0 голосов
/ 29 июля 2009

Я возвращаюсь к SubSonic в проекте с достаточно встроенным v2.1 (то есть мы не будем переключать его на v3).

Я перебираю кучу параметров метода, чтобы построить длинный, но не слишком сложный запрос. В конце этого запроса мне нужно добавить оператор, который добавляет группу операторов 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, которые могут или не могут существовать.

Ответы [ 3 ]

2 голосов
/ 29 июля 2009

хорошо, я понял. Это вопрос использования 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 голосов
/ 29 июля 2009

Существуют query.OpenExpression () и query.CloseExpression () для ручного создания открытых и закрытых паренов, но я не знаю, как добавить их в конец существующего набора критериев.

0 голосов
/ 29 июля 2009

Вы можете просто разбить его на пару запросов, по одному для каждого оператора «ИЛИ».

е:

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 () или что-то в этом роде?)

...