【问题标题】:How do I build a dynamic sql query with Dapper.SqlBuilder and OrWhere如何使用 Dapper.SqlBuilder 和 OrWhere 构建动态 sql 查询
【发布时间】:2016-09-26 00:18:53
【问题描述】:

我正在尝试为多个搜索词构建动态 Sql 查询。我大体上了解如何使用构建器,但不确定在循环中要做什么,因为我实际上每次都需要 @term 不同(我认为)。不仅在查询中,而且在匿名类型中也要匹配。

我可以在查询字符串中使用 string.Format,但不确定如何在匿名类型中匹配它?

public async Task<List<Thing>> Search(params string[] searchTerms)
{
    var builder = new SqlBuilder();
    var template = builder.AddTemplate("SELECT * /**select**/ from ThingTags /**where**/ ");

    for (int i = 0; i < searchTerms.Length; i++)
    {
        builder.OrWhere("value LIKE @term", new { term = "%" + searchTerms[i] + "%" });
    }
...
}

在当前形式中,为术语“abc”“def”“ghi”创建的查询是

CommandType: Text, CommandText: SELECT *  from ThingTags WHERE  ( value LIKE @term OR value LIKE @term OR value LIKE @term ) 

Parameters:
Name: term, Value: %ghi%

【问题讨论】:

    标签: dapper sqlbuilder


    【解决方案1】:

    您可以使用DapperQueryBuilder轻松创建动态条件:

    var query = cn.QueryBuilder($@"
        SELECT * 
        FROM ThingTags 
       /**where**/");
    
    // by default multiple filters are combined with AND
    query.FiltersType = Filters.FiltersType.OR; 
    
    foreach (var searchTerm in searchTerms)
        query.Where($"value like {searchTerm}");
    
    var results = query.Query<YourPOCO>();
    

    输出是完全参数化的 SQL (WHERE value like @p0 OR value like @p1 OR...)。您不必手动管理参数字典。

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

    【讨论】:

      【解决方案2】:

      这是进行查询构建的一种方法。最初我没有意识到参数可能是字典。

      public async Task<List<Thing>> Search(params string[] searchTerms)
      {
      var builder = new SqlBuilder();
      var template = builder.AddTemplate("SELECT * /**select**/ from ThingTags /**where**/ ");
      
          for (int i = 0; i < searchTerms.Length; i++)
          {
              var args = new Dictionary<string, object>();
              var termId = string.Format("term{0}", i.ToString());
              args.Add(termId, "%" + searchTerms[i] + "%");
              builder.OrWhere("value LIKE @" + termId, args);
          }
      ...
      }
      

      【讨论】:

      • 感谢您回答您的问题。只是一个侧面评论; string.Format 效率低下。使用term + i.ToString() 或string.Format("term{0}", i)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2017-06-29
      • 2018-08-04
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多