使用 WHERE IN 的 C# Dapper 查询

标签 c# dapper

我正在尝试执行这样的简洁查询:

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/

相关文章:

c# - Dapper - 将 int 列表传递给存储过程

inheritance - Dapper - 映射使用表继承的多个结果集

c# - 在 C# 中解析 json w 变量键值对

c# - 文本框 - 绑定(bind)属性名称

c# - 如何使用 azure 存储表实现每秒 10 次以上的插入

C# - 使用 Dapper 构建分层数据结构

dapper - 当结果集具有未映射的列时,如何使 Dapper.NET 抛出?

c# - 在 async/await 上阻塞主线程

c# - 使用 LINQ to SQL 访问系统数据库/表?

c# - Razor C# - 从数据库中获取数据