如何使用多个LIKE-s创建不会在dapper缓存中创建内存问题的查询?

Mkr*_*yan 0 .net c# sql asp.net-mvc dapper

我正在使用Dapper来处理sql数据库.我的网站项目中有一些搜索逻辑.

我的搜索获取字符串参数列表.

//filter is list of strings

var sql = new StringBuilder();
sql.Append("SELECT LibraryDocumentId FROM LibraryDocumentKeywords WHERE ");

sql.Append(string.Join("OR ", filter.Select(f => string.Format("LOWER(Keyword) LIKE '%{0}%'", f)).ToList()));

var isList = conn.Query<int>(sql.ToString()).ToList();
Run Code Online (Sandbox Code Playgroud)

实际上我不想使用这种生成动态SQL查询的方法,因为Dapper会缓存每一个查询.我宁愿通过参数传递过滤器.有人可以帮助我吗?任何的想法 ?

Mar*_*ell 5

你目前所拥有的是一个巨大的SQL注入风险.您可能想在DynamicParameters这里使用,即(完全未经测试,您可能需要略微调整):

var sql = new StringBuilder(
    "SELECT LibraryDocumentId FROM LibraryDocumentKeywords");
int i = 0;
var args = new DynamicParameters();
foreach(var f in filter) {
    sql.Append(i == 0 ? " WHERE " : " OR ")
        .Append("LOWER(Keyword) LIKE @p").Append(i);
    args.Add("p" + i, "%" + f + "%");
    i++;
}
var data = conn.Query<int>(sql.ToString(), args);
Run Code Online (Sandbox Code Playgroud)

这应该相当干净地缓存(每个过滤器的一个缓存项,无论其内容如何).