如何创建具有多个 LIKE 的查询,并且不会在 Dapper 的缓存中产生内存问题

问题描述 投票:0回答:1

我正在使用 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 会缓存每个查询。我更愿意通过参数传递过滤器。有人可以帮我吗?

c# sql .net dapper
1个回答
8
投票

你现在面临的也是一个巨大的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);

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

© www.soinside.com 2019 - 2024. All rights reserved.