Как создать запрос с несколькими LIKE-серверами, которые не создают проблемы с памятью в кэше dapper?

.net asp.net-mvc c# dapper sql

Вопрос

Я использую 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 будет кэшировать каждый отдельный запрос. Я бы предпочел передать фильтр с параметром. Может ли кто-нибудь помочь мне с этим? Есть идеи ?

Принятый ответ

То, что у вас есть на данный момент, также представляет собой огромный риск инъекции 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);

Это должно кэшировать достаточно чисто (один элемент кэша на количество фильтров, независимо от их содержимого).



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему