Поддерживает ли 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
?
Ответы
Ответ 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 });