我正在尝试执行这样的简洁查询:
string query = "select * from MyTable where someNumber in @Nums;";
...
connection.Query<ReturnObj>(query, new {Nums = nums})
如果 nums 为空,我会收到 MySql 语法错误。看起来 Dapper 将查询更改为如下所示: WHERE 1 = 0)
所以我猜左边的 ( 丢失了,这导致了语法错误。是的,我意识到我可以检查一下如果在执行查询之前集合为空,但如果不需要,我宁愿不这样做。
最佳答案
这是一个bug in Dapper它创建了一条对 MySQL Server 5.6(及更早版本)无效的 SQL 语句。
解决方法:
- 升级到 MySQL Server 5.7(接受 SQL Dapper 生成并返回预期结果)
- 正如您所说,在执行查询之前检查集合是否为空
检查集合是否为空的一种变体(如果您有复杂的查询、NOT IN
等,这可能很有用):
var numsSql = nums.Any() ? "@Nums" : "(select null)";
var query = $"select * from MyTable where someNumber in {numsSql};";
conn.Query(query, new { Nums });
关于使用 WHERE IN 的 C# Dapper 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11996639/