如何使用Dapper.SqlBuilder和OrWhere构建动态sql查询

时间:2016-05-27 15:25:26

标签: dapper sqlbuilder

我正在尝试为多个搜索词构建动态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] + "%" });
    }
...
}

在当前表单中为术语创建的查询&#34; abc&#34; &#34; DEF&#34; &#34; GHI&#34;是

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

Parameters:
Name: term, Value: %ghi%

2 个答案:

答案 0 :(得分:6)

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

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);
    }
...
}

答案 1 :(得分:0)

您可以使用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...)。您不必手动管理参数字典。

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