SubSonic 2.1的嵌套OR语句

时间:2009-07-29 17:22:25

标签: c# sql subsonic

我正在回到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 个答案:

答案 0 :(得分: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));
    }
}

答案 1 :(得分: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()或其他什么吗?)

答案 2 :(得分:0)

有query.OpenExpression()和query.CloseExpression()手动创建一个打开和关闭的parens,但我不知道如何将它们添加到现有标准集的末尾。