字符串.使用SQL通配符格式化会导致Dapper查询中断
本文关键字:Dapper 查询 中断 使用 SQL 通配符 格式化 字符串 | 更新日期: 2023-09-27 18:15:11
我有一点奇怪的问题与Dapper和字符串格式。以下是相关代码:
string end_wildcard = @"
SELECT * FROM users
WHERE (first_name LIKE CONCAT(@search_term, '%') OR last_name LIKE CONCAT(@search_term, '%'));";
string both_wildcards = @"
SELECT * FROM users
WHERE (first_name LIKE CONCAT('%', @search_term, '%') OR last_name LIKE CONCAT('%', @search_term, '%'));";
string formatted = @"
SELECT * FROM users
WHERE (first_name LIKE {0} OR last_name LIKE {0});";
string use_end_only = @"CONCAT(@search_term, '%')";
string use_both = @"CONCAT('%', @search_term, '%')";
// if true, slower query due to not being able to use indices, but will allow searching inside strings
bool allow_start_wildcards = false;
string query = String.Format(formatted, allow_start_wildcards ? use_both : use_end_only);
string term = "blah"; // the term the user searched for
// Using Dapper
db.Query(end_wildcard, new{ search_term = term}); // Works and returns results
db.Query(both_wildcards, new{ search_term = term}); // Works and returns results
db.Query(query, new{ search_term = term}); // Returns nothing
前两个查询(其中包含通配符的CONCAT语句被放入字符串中)工作得很好。但是,如果我取出CONCAT语句并使用String注入一个或另一个。格式,我得到0个结果。
最奇怪的部分是我可以调试它,获取它使用的实际查询字符串,将其放入MySQL并使用@search_term参数集运行它,并在暂停时获得结果。让代码继续,我得到0个结果。从字面上看,唯一不同的是一个是预编译的字符串,而另一个使用string . format。
'@'和'%'被String视为特殊字符。格式,还是有什么我看不出来的?格式化字符串实际上是字节对字节地等于两个未格式化字符串中的一个,同样,将其粘贴到MySQL中实际上会得到格式化字符串的结果。Dapper似乎只喜欢两个,而不是第三个,即使它正好等于前两个中的一个。
请准确地指示您的query
和term
在失败的示例中是什么。我无法在这里重现任何问题。如果我使用发布的代码,query
与end_wildcard
相同,并且:它工作得很好。在本地测试设备中(使用一些虚构的数据),我有:
connection.Query(end_wildcard, new { search_term = term }).Count().IsEqualTo(2);
connection.Query(both_wildcards, new { search_term = term }).Count().IsEqualTo(3);
connection.Query(query, new { search_term = term }).Count().IsEqualTo(2);
如果你看到不同的东西,我只能得出结论,它一定与你的具体例子有关。
但是具体来说:
'@'和'%'被String视为特殊字符。格式,还是有什么我看不出来的?
不;string.Format
只关心{n}
(对于整数n
)和{{
/}}
(分别是{
和}
的转义序列)。
基本上,我发现dapper不太可能做任何与此相关的事情,但是显示您的确切query
和term
, 当它失败时会有所帮助。