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格式,如:

 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没有正确parsing参数@T的结尾吗?

尝试:

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

关于运算符没有什么特别的地方,你不需要在string里面使用params,它们将不会工作,而是被解释为一个string。

注意

在你的第二个代码段中的硬编码的例子是强烈的不鼓励,除了是一个SQL注入的巨大问题,它可以导致短小精灵泄漏。

警告

任何like通配符的匹配都不是SARGable,这意味着它很慢并且需要索引扫描。

最好的方法来使用它来添加在查询中的concat函数,因为它保存在sql注入以及,concat函数只支持以上比sql 2012

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

是的,它确实。 这个简单的解决scheme每次都为我工作:

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

Sam的回答并不适合我,所以经过一些testing后,我想出了使用SQLite CONCAT等价物的方法 :

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