如何创建具有多个LIKE-s的查询,而不会在dapper缓存中产生内存问题

本文关键字:dapper 缓存 问题 内存 查询 创建 何创建 LIKE-s | 更新日期: 2023-09-27 18:03:37

我使用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();

实际上我不想用这种方法生成动态SQL查询,因为Dapper会缓存每一个查询。我更喜欢传递带有参数的过滤器。有人能帮我一下吗?你知道吗?

如何创建具有多个LIKE-s的查询,而不会在dapper缓存中产生内存问题

您目前拥有的也是一个巨大的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);

这应该是相当干净的缓存(每个过滤器数量一个缓存项,不管它们的内容)。