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

时间:2014-08-13 22:20:24

标签: c# dapper postgresql-9.3

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

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代码库的情况下使用变通方法?感谢。

1 个答案:

答案 0 :(得分:8)

是的,这看起来像是与postgres中处理数组类型相关的错误;这是postgres特有的,所以与你提到的“涉嫌修复”的帖子无关。我会诚实地对你说:我对postgres数组知之甚少 - 该代码来自用户贡献,IIRC。如果您使用本机postgres语法,即

,我将非常有兴趣知道它是否有效
WHERE MyId = ANY(@myIds)

但是,我同意如果我们可以在RDBMS上使用相同的语法,那将会很好。

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