使用简洁的网络...

以下内容不会在数据对象中产生任何结果:

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的结尾?

推荐答案

try :

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

like运算符没有什么特别之处,您永远不希望参数包含在字符串文本中,它们将不起作用,相反,它们将被解释为字符串.

note

强烈建议不要使用第二个代码片段中的硬编码示例,它不仅是sql注入的一个巨大问题,还可能导致dapper泄漏.

caveat

任何以通配符开头的like个匹配都是不可搜索的,这意味着它很慢,需要进行索引扫描.

Sql相关问答推荐

提取Snowflake SQL中的嵌套键

SQL查询每个客户的最新条目

如何在幂函数中正确使用Power()和Exp()

如果开始期间不存在PostgresSql回填数据

在SQL中使用类别值将行转置为列

PostgreSQL使用SQL子查询在时间间隔内 Select 数据

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

PostgreSQL:按小时查看调整日期

如何在SQL Server中统计按备注分组的记录数

在SQL中将项分配给容器

通过UPDATE SELECT更新表时出现问题

MySQL中的递归查询邻接表深度优先?

SQL根据另一列的顺序和值获取组中的最后一列

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

为数组中的每个元素从表中收集最大整数

如何跨行合并以删除 SQL 中的空值?

snowfalke 会在 Select 运行时锁定表吗?

ACCESS SQL - 有没有办法使用通配符仅 Select 字段的特定部分?

如何在 SQL Server 中参数化 Select top 'n'