web-dev-qa-db-fra.com

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

Utilisation de Dapper-dot-net ...

Les éléments suivants ne produisent 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 j'utilise simplement un format de chaîne normal 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. Dapper n'analyse-t-il pas correctement la fin du paramètre @T?

58
Jay Stevens

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

Les opérateurs similaires n'ont rien de spécial, vous ne voulez jamais que vos paramètres soient à l'intérieur des littéraux de chaîne, ils ne fonctionneront pas, ils seront plutôt interprétés comme une chaîne.

note

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.

mise en garde

Toute correspondance like qui mène avec un caractère générique n'est pas SARGable, ce qui signifie qu'elle est lente et nécessitera un balayage d'index.

62
Sam Saffron

Le meilleur moyen d'utiliser cela pour ajouter la fonction concat dans la requête car il enregistre également 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});
25
Atir Naveed

Oui. Cette solution simple a fonctionné pour moi à chaque fois:

db.Query<Remitente>("SELECT * 
                     FROM Remitentes 
                     WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
                   .ToList();
20
eliaquin

La réponse de Sam ne fonctionnait pas pour moi, donc après quelques tests, j'ai trouvé l'utilisation de équivalent SQLite CONCAT qui semble fonctionner:

string sql = "SELECT * FROM myTable WHERE Name LIKE '%' || @NAME || '%'";
var data = IEnumerable data = conn.Query(sql, new { NAME = Name });
3
Dscoduc