11

我试图为 Dapper 使用 SqlBuilder 的 Where 和 OrWhere 方法,但它的行为不像我期望的那样。

这个问题的编辑部分基本上是我遇到的。由于它没有收到回复,我会在这里问它。

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 子句添加 OR?

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

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

3 回答 3

9

没关系。我查看了SqlBuilder的代码,发现如果有Where和OrWhere的混合,它会做如下的事情:

  • 加入所有 AND 子句
  • 分别加入所有 OR 子句
  • 用 AND 将 OR 子句附加在 AND 子句的末尾

如果您的 OrWhere 不超过 1 个,那么您将看不到任何 OR。

我将修改我的查询逻辑以考虑到这一点

于 2015-07-22T18:53:08.827 回答
2

您必须将查询更改为:

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 });
于 2017-11-08T09:27:38.527 回答
1

如果您想尝试另一种选择,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)。
您不必手动管理参数字典。

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

于 2020-08-07T23:30:14.220 回答