使用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 });
Run Code Online (Sandbox Code Playgroud)
但是,当我只使用常规字符串格式时:
string QueryString = String.Format("select top 25 Term as Label, Type, ID from SearchTerms WHERE Term like '%{0}%'", term);
var data = conn.Query(QueryString);
Run Code Online (Sandbox Code Playgroud)
我在集合中得到25行.Dapper没有正确解析参数的结尾@T吗?
Sam*_*ron 63
尝试:
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 });
Run Code Online (Sandbox Code Playgroud)
对于类似运算符没有什么特别之处,你永远不希望你的params在字符串文字中,它们将无法工作,相反它们将被解释为字符串.
注意
第二个代码段中的硬编码示例强烈建议不要使用,除了sql注入的一个巨大问题,它可能会导致dapper泄漏.
警告
like使用通配符的任何匹配都不是SARGable,这意味着它很慢并且需要索引扫描.
小智 25
最好的方法是使用它在查询中添加concat函数,因为它保存在sql注入中,但是concat函数只支持上面的sql 2012
string query = "SELECT * from country WHERE Name LIKE CONCAT('%',@name,'%');"
var results = connection.query<country>(query, new {name});
Run Code Online (Sandbox Code Playgroud)
eli*_*uin 20
是的,它确实.这个简单的解决方案每次都适合我:
db.Query<Remitente>("SELECT *
FROM Remitentes
WHERE Nombre LIKE @n", new { n = "%" + nombre + "%" })
.ToList();
Run Code Online (Sandbox Code Playgroud)
Sam 的回答对我不起作用,所以经过一些测试后,我想出了使用SQLite CONCAT 等效项,它似乎有效:
string sql = "SELECT * FROM myTable WHERE Name LIKE '%' || @NAME || '%'";
var data = IEnumerable data = conn.Query(sql, new { NAME = Name });
Run Code Online (Sandbox Code Playgroud)