0

我想使用 DbExtensions 构建一个 SQL 语句。我需要用 AND 和 OR 构建一个 WHERE 子句。像这样的东西

SELECT *
FROM myTable
WHERE (Field1 LIKE '%a%' OR Field1 LIKE '%b%')
    AND (Field2 LIKE '%a%' OR Field2 LIKE '%b%')

我需要在循环中执行此操作。

var builder = SQL
    .SELECT("*")
    .FROM("myTable")
    .WHERE();

foreach (var field in fields) {
    foreach (var value in field.values) {
        builder.AppendClause("WHERE", " OR ", field.columnName + " LIKE {0}", new object[] { "%" + value.Value + "%" });
    }
}

上面的代码似乎产生了这样的 SQL 语句

SELECT *
FROM myTable
WHERE Field1 LIKE '%a%' OR Field1 LIKE '%b%'
    OR Field2 LIKE '%a%' OR Field2 LIKE '%b%'

如您所见,如果没有任何括号,并且有一个 OR 而不是 AND。

无论如何,我可以让 DbExtensions 使用可用的方法来做我想做的事情,而不必将这一切都写到另一个 stringBuilder 中?

编辑 我已经按照建议更改了我的代码

var builder = SQL
   .SELECT("*")
   .FROM("myTable")
   .WHERE();

foreach (var field in fields) {
   builder._OR(field.values, field.columnName + " LIKE {0}", v => new object[1] { "%" + v.ToString() +  "%" });
}

但我还需要在当前块中附加一个 OR。所以假设每个字段都有一个名为“CheckBlank”的属性,如果为真,我需要添加“OR FieldX IS NULL”怎么做?因此,如果 Field1.CheckBlank 为真,我希望最终得到这样的 SQL,但 Field2 CheckBlank 为假

SELECT *
FROM myTable
WHERE (Field1 LIKE '%a%' OR Field1 LIKE '%b%' OR Field1 IS NULL)
    AND (Field2 LIKE '%a%' OR Field2 LIKE '%b%')
4

2 回答 2

0

您可以使用此示例生成指定的查询。

询问:

SELECT *
FROM myTable
WHERE (Field1 LIKE '%a%' OR Field1 LIKE '%b%')
    AND (Field2 LIKE '%a%' OR Field2 LIKE '%b%')

执行此操作的代码片段:

var builder = SQL
    .SELECT("*")
    .FROM("myTable")
    .WHERE();

foreach (var field in fields) {
        builder.WHERE("").Append("(")
        var index = 0;
        foreach (var value in field.values) {
            builder.AppendClause("WHERE", index == 0 ? "": " OR ", field.columnName + " LIKE {0}", new object[] { "%" + value.Value + "%" });
        }
        index++;
        builder.Append(")");
    }
于 2015-06-24T21:52:11.343 回答
0

尝试这个:

var builder = SQL
   .SELECT("*")
   .FROM("myTable")
   .WHERE();

foreach (var field in fields) {
   builder._OR(field.values, field.columnName + " LIKE {0}", v => new object[1] { "%" + v.ToString() +  "%" });
}

我不知道将%与参数值合并是否是最佳选择。我主要使用 MySQL,我在哪里工作Field1 LIKE CONCAT('%', {0}, '%')。不要将参数值附加到格式字符串,它可能会暴露注入。

于 2015-06-25T04:07:22.547 回答