Поддерживает ли Dapper похожий оператор? - PullRequest
55 голосов
/ 17 мая 2011

Использование Dapper-dot-net ...

Следующее не дает результатов в объекте данных:

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

Однако, когда я просто использую обычный формат строки, например:1006 *

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

Я получаю 25 строк в коллекции.Не правильно ли Dapper анализирует конец параметра @T?

Ответы [ 4 ]

61 голосов
/ 17 мая 2011

Попробуйте:

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

В таких операторах нет ничего особенного, вы никогда не захотите, чтобы ваши параметры были внутри строковых литералов, они не будут работать, вместо этого они будут интерпретироваться как строка.

note

Жестко запрограммированный пример во втором фрагменте кода настоятельно не рекомендуется, кроме того, что он представляет собой огромную проблему с внедрением SQL-кода, он может вызвать утечку.

предостережение

Любое совпадение like, начинающееся с подстановочного знака, не является SARGable, что означает, что оно медленное и требует сканирования индекса.

25 голосов
/ 16 марта 2016

Лучший способ использовать это для добавления в запрос функции concat, так как она также сохраняется в SQL-инъекциях, но функция concat поддерживает только выше SQL 2012

string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});
19 голосов
/ 12 февраля 2017

Да, это так. Это простое решение работало для меня каждый раз:

db.Query<Remitente>("SELECT * 
                     FROM Remitentes 
                     WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
                   .ToList();
3 голосов
/ 25 июля 2016

Ответ от Сэма мне не помог, поэтому после некоторого тестирования я решил использовать эквивалент SQLite CONCAT , который, кажется, работает:

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