¿Dapper es compatible con el operador like?

dapper sql

Pregunta

Usando Dapper-dot-net ...

Lo siguiente no produce resultados en el objeto de datos:

var data = conn.Query(@"
    select top 25 
    Term as Label, 
    Type, 
    ID 
    from SearchTerms 
    WHERE Term like '%@T%'", 
    new { T = (string)term });

Sin embargo, cuando uso un formato de cadena normal como:

string QueryString = String.Format("select top 25 Term as Label, Type, ID from SearchTerms WHERE Term like '%{0}%'", term);
var data = conn.Query(QueryString);

Obtengo 25 filas en la colección. ¿Dapper no está analizando correctamente el final del parámetro @T ?

Respuesta aceptada

Tratar:

term = "whateverterm";
var encodeForLike = term => term.Replace("[", "[[]").Replace("%", "[%]");

string term = "%" + encodeForLike(term) + "%";
var data = conn.Query(@"
   select top 25 
  Term as Label, 
  Type, 
  ID 
  from SearchTerms 
  WHERE Term like @term", 
  new { term });

No hay nada especial acerca de los operadores similares, nunca desea que sus parámetros estén dentro de los literales de cadena, no funcionarán, sino que se interpretarán como una cadena.

Nota

Se desaconseja enérgicamente el ejemplo codificado en su segundo fragmento, además de ser un gran problema con la inyección de sql, puede provocar que el apresurador tenga fugas.

advertencia

Cualquier coincidencia like que lidere con un comodín no es SARGable, lo que significa que es lenta y requerirá un escaneo de índice.


Respuesta popular

La mejor forma de usar esto para agregar la función concat en la consulta, ya que también se guarda en la inyección sql, pero la función concat solo es compatible por encima de sql 2012

string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});


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é