Comment créer une requête avec plusieurs LIKE-s qui ne créent pas de problème de mémoire dans le cache Dapper?

.net asp.net-mvc c# dapper sql

Question

J'utilise Dapper pour travailler avec la base de données SQL. J'ai une logique de recherche dans mon projet de site Web.

Ma recherche obtient la liste des paramètres de chaîne.

//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();

En fait, je ne veux pas utiliser cette approche de génération de requête SQL dynamique, car Dapper mettra en cache chaque requête. Je préférerais passer le filtre avec le paramètre. Est-ce que quelqu'un peut m'aider avec ça? Une idée ?

Réponse acceptée

Ce que vous avez en ce moment est également un énorme risque d’injection SQL. Vous pourriez vouloir utiliser DynamicParameters ici, c.-à-d. (Complètement non testé, vous devrez peut-être modifier légèrement):

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

Cela devrait mettre en cache assez proprement (un élément de cache par nombre de filtres, quel que soit leur contenu).



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi