【问题标题】:Dapper SqlBuilder OrWhere using AND instead of ORDapper SqlBuilder OrWhere 使用 AND 而不是 OR
【发布时间】:2015-10-05 04:24:06
【问题描述】:

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

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 子句添加 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;
}

【问题讨论】:

    标签: dapper sqlbuilder


    【解决方案1】:

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

    • 加入所有 AND 子句
    • 单独加入所有 OR 子句
    • 用 AND 将 OR 子句附加到 AND 子句的末尾

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

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

    【讨论】:

    • 那么您的解决方案看起来如何?我也偶然发现了这个问题,在查看了 SqlBuilder 的源代码后,我想知道嵌套 OR 和 AND 是否在 sqlbuilder 中起作用: (... OR ...) AND (... OR ...) vs. (... AND ...) OR (... AND ...)
    • 据我记忆,它似乎是这样工作的。 (... AND ... AND ... AND (... OR ... OR ... OR))。它将所有的 AND 放在一起,然后将 OR 放在他们自己的组中
    • 我有两个 OrWhere 和两个 Where。我在生成的查询中没有看到任何 AND,只有 OR。
    【解决方案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 });
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我期待着给 DapperQueryBuilder 一些时间。它看起来很棒,做得很好。调试时是否容易看到生成的 SQL 是什么?
      • @Zac 是的,如果您将鼠标悬停在“查询”上,您应该会看到基础查询和附加参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多