我正在回到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语句的查询,而这些语句可能已经存在,也可能不存在。
答案 0 :(得分:2)
// 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,但我不知道如何将它们添加到现有标准集的末尾。