首先,我遇到的问题与我们讨论的问题相同,据称大约在两年前修复过。有关该问题,请参阅以下问题:
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;
如果相反,我在行if (FeatureSupport.Get(command.Connection).Arrays)
上的Dapper(v1.29)SqlMapper.PackListParameters函数中放置一个断点,并手动将执行移动到else部分,然后查询运行并返回预期结果。
我注意到.Arrays
属性显式地将Postgres称为受支持的数据库,所以我想知道:这是我的代码,Dapper代码,Dapper配置还是Postgres配置的问题?是否可以在不修改Dapper代码库的情况下使用变通方法?感谢。
答案 0 :(得分:8)
是的,这看起来像是与postgres中处理数组类型相关的错误;这是postgres特有的,所以与你提到的“涉嫌修复”的帖子无关。我会诚实地对你说:我对postgres数组知之甚少 - 该代码来自用户贡献,IIRC。如果您使用本机postgres语法,即
,我将非常有兴趣知道它是否有效WHERE MyId = ANY(@myIds)
但是,我同意如果我们可以在RDBMS上使用相同的语法,那将会很好。
实际上,它已经在该代码中标记了另一个需要修复的错误(在FeatureSupport
查找中)。