Dapper SqlBuilder OrWhere使用AND而不是OR

时间:2015-07-15 22:11:45

标签: dapper sqlbuilder

我试图使用SqlBuilder的Where和OrWhere方法来实现Dapper,但它的表现并不像我期望的那样。

this question的编辑部分基本上就是我遇到的内容。由于它没有收到回复,我会在这里提出来。

var builder = new SqlBuilder();
var sql = builder.AddTemplate("select * from table /**where**/ ");
builder.Where("a = @a", new { a = 1 })
        .OrWhere("b = @b", new { b = 2 });

我期待select * from table WHERE a = @a OR b = @b

但我得到了select * from table WHERE a = @a AND b = @b

有没有办法使用SqlBuilder将where子句添加到where子句?

我认为只是将SqlBuilder类中的以下内容更改为OR而不是AND,但我想确认。

public SqlBuilder OrWhere(string sql, dynamic parameters = null)
{
    AddClause("where", sql, parameters, " AND ", prefix: "WHERE ", postfix: "\n", IsInclusive: true);
    return this;
}

3 个答案:

答案 0 :(得分:5)

没关系。我查看了SqlBuilder代码,发现如果有Where和OrWhere的混合,它将执行以下操作:

  • 加入所有AND条款
  • 单独加入所有OR条款
  • 使用AND
  • 附加AND子句末尾的OR子句

如果你没有超过1个OrWhere,那么你就不会看到任何OR。

我将修改我的查询逻辑以将此考虑在内

答案 1 :(得分:0)

您必须将查询更改为:

var builder = new SqlBuilder();
var sql = builder.AddTemplate("select * from table /**where**/ ");
builder.OrWhere("a = @a", new { a = 1 })
        .OrWhere("b = @b", new { b = 2 });

答案 2 :(得分:0)

如果您想尝试其他替代方法, DapperQueryBuilder 可能更容易理解:

var query = cn.QueryBuilder($@"
    SELECT * 
    FROM table 
   /**where**/
");


// by default multiple filters are combined with AND
query.FiltersType = Filters.FiltersType.OR; 

int a = 1;
int b = 2;

query.Where($"a = {a}");
query.Where($"b = {b}");


var results = query.Query<YourPOCO>();

输出为完全参数化的SQL(WHERE a = @p0 OR b = @p1)。
您不必手动管理参数字典。

免责声明:我是该库的作者之一