C# · 12月 23, 2021

c# – 使用Postgres中的IEnumerable参数进行IN查询的Dapper AddDynamicParams

首先,我遇到了所讨论的同样的问题,据称大约在两年前修复了.有关该问题,请参阅以下问题:

Dapper AddDynamicParams for IN statement with “dynamic” parameter name

我遇到的问题是,当我对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代码库的情况下使用变通方法?谢谢.

解决方法 是的,这看起来像是与postgres中数组类型处理相关的错误;这是postgres特有的,所以与你提到的“涉嫌修复”的帖子无关.我会诚实地对你说:我对postgres数组知之甚少 – 该代码来自用户贡献,IIRC.如果您使用本机postgres语法,我会非常有兴趣知道它是否有效,即 WHERE MyId = ANY(@myIds)

但是,我同意如果我们可以在RDBMS上使相同的语法工作,那将是很好的.

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