¿Cómo crear consultas con múltiples LIKE-s que no crean problemas de memoria en el dapper cache?

.net asp.net-mvc c# dapper sql

Pregunta

Estoy usando Dapper para trabajar con la base de datos sql. Tengo un poco de lógica de búsqueda en mi proyecto de sitio web.

Mi búsqueda obtiene una lista de parámetros de cadena.

//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 realidad, no quiero utilizar este enfoque para generar consultas SQL dinámicas, porque Dapper guardará en caché todas las consultas. Preferiría pasar filtro con parámetro. ¿Puede alguien ayudarme con eso? Alguna idea ?

Respuesta aceptada

Lo que tienes en este momento también es un gran riesgo de inyección SQL. Es posible que desee utilizar DynamicParameters aquí, es decir, (no probado por completo, es posible que deba modificarlo ligeramente):

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

Esto debe almacenar en caché bastante limpiamente (un elemento de caché por cantidad de filtros, independientemente de su contenido).



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué