Подтвердить что ты не робот

Поддерживает ли Dapper такой же оператор?

Использование 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 });

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

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?

4b9b3361

Ответ 1

Попробуйте:

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

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

примечание

Твердый код в вашем втором фрагменте настоятельно не рекомендуется, помимо огромной проблемы с SQL-инъекцией, это может привести к утечке dapper.

caveat

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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