Dapper AddDynamicParams for IN query with IEnumerable parame

本文关键字:with IEnumerable parame query IN AddDynamicParams for Dapper | 更新日期: 2023-09-27 18:17:58

首先,我遇到了大约两年前讨论过的相同问题,据称已经修复。 有关该问题,请参阅以下问题:

Dapper AddDynamicParams for IN 语句,带有"dynamic"参数名称

我遇到的问题是,当我对我的Postgres 9.3数据库执行类似的查询(SELECT * FROM MyTable WHERE MyId IN @myIds(时,我收到以下异常:

Npgsql.NpgsqlException : ERROR: 42883: operator does not exist: integer = integer[]

执行此查询的代码如下:

List<MyTable> result;
var query = "SELECT * FROM MyTable WHERE MyId IN @myIds";
var queryParams = new Dictionary<string, object> {
    { "myIds", new [] { 5, 6 } }
};
var dynamicParams = new DynamicParameters(queryParams);
using (var connection = new NpgsqlConnection(connectionString)) {
    result = connection.Query<MyTable>(query, dynamicParams).ToList();
}
return result;

相反,如果我在 Dapper 的 (v1.29( SqlMapper.PackListParameters 函数中将断点放在行if (FeatureSupport.Get(command.Connection).Arrays)上,并手动将执行移动到 else 部分,则查询将运行并返回预期的结果。

我注意到 .Arrays 属性明确指出 Postgres 作为受支持的数据库,所以我想知道:这是我的代码、Dapper 代码、Dapper 配置或 Postgres 配置的问题吗? 是否有无需修改 Dapper 代码库即可使用的解决方法? 谢谢。

Dapper AddDynamicParams for IN query with IEnumerable parame

是的,这看起来像是与 postgres 中数组类型的处理相关的错误; 这是特定于Postgres的,因此与您引用的"据称已修复"帖子无关。老实说:我对 postgres 数组了解不多 - 该代码来自用户贡献 IIRC。如果您使用本机 postgres 语法,我会非常想知道它是否有效,即

WHERE MyId = ANY(@myIds)

但是,我同意如果我们可以在任一RDBMS上使用相同的语法,那就太好了。

不过,实际上,它已经在该代码中标记了另一个需要修复的错误(在FeatureSupport查找中(。