首先,我遇到了与两年前讨论过的相同问题,据称该问题已得到解决。有关该问题,请参阅以下问题:
Dapper AddDynamicParams for IN 语句,具有“动态”参数名称 https://stackoverflow.com/questions/12723922/dapper-adddynamicparams-for-in-statement-with-dynamic-parameter-name
我遇到的问题是,当我执行类似的查询时(SELECT * FROM MyTable WHERE MyId IN @myIds
)针对我的 Postgres 9.3 数据库,我收到以下异常:
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 代码库的解决方法?谢谢。