首先,我遇到了两年前讨论并据称已经解决的同样问题。请参考以下问题:Dapper AddDynamicParams for IN statement with "dynamic" parameter name。
我遇到的问题是,在我的Postgres 9.3数据库中执行类似查询(
如果我在Dapper的(v1.29) SqlMapper.PackListParameters函数中的行
我注意到
我遇到的问题是,在我的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代码库?谢谢。
WHERE MyId = ANY(@myIds)
可以正常工作。重新编译并使用FeatureSupport {Arrays = false}
也允许常规的WHERE MyId IN @myIds
正常工作。(这是问题#150:https://github.com/StackExchange/dapper-dot-net/issues/150) - Jacob Krall