Dapper prend-il en charge l'opérateur similaire?

dapper sql

Question

En utilisant Dapper-dot-net ...

Ce qui suit ne donne aucun résultat dans l'objet de données:

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

Cependant, lorsque je n’utilise qu’un format de chaîne comme:

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

Je récupère 25 lignes dans la collection. Est-ce que Dapper n'analyse pas correctement la fin du paramètre @T ?

Réponse acceptée

Essayer:

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

Il n'y a rien de particulier dans les opérateurs, vous ne voulez jamais vos paramètres dans les littéraux, ils ne fonctionneront pas, ils seront interprétés comme une chaîne.

Remarque

L'exemple codé en dur dans votre deuxième extrait est fortement déconseillé, en plus d'être un énorme problème avec l'injection SQL, il peut provoquer une fuite de Dapper.

caveat

Toute correspondance like qui commence par un caractère générique n'est pas SARGable, ce qui signifie qu'elle est lente et nécessitera une analyse d'index.


Réponse populaire

La meilleure façon d'utiliser ceci pour ajouter une fonction de concat dans la requête car elle permet également d'économiser dans l'injection SQL, mais la fonction concat est uniquement prise en charge au-dessus de sql 2012

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



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