Dapper是否支持类似运营商?

Jay*_*ens 56 sql 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 });
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,这意味着它很慢并且需要索引扫描.

  • 对于任何不知道“**SARGable**”的人(比如我),[这里有一个解释](https://en.wikipedia.org/wiki/Sargable)。 (2认同)

小智 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)

  • 您还可以使用'+'代替CONCAT,例如:“ SELECT * from country WHERE Name Like'%'+ @name +'%';” (2认同)

eli*_*uin 20

是的,它确实.这个简单的解决方案每次都适合我:

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

  • 这肯定是我最喜欢的 - 我也使用字符串插值,所以它变成了... new { n = $"%{nombre}%" } (5认同)
  • 这是我最喜欢的答案……简单明了 (2认同)
  • 应该是公认的答案 (2认同)

Dsc*_*duc 5

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)