Dapper在Postgres中使用IEnumerable参数进行IN查询时,如何使用AddDynamicParams?

7
首先,我遇到了两年前讨论并据称已经解决的同样问题。请参考以下问题: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代码库?谢谢。
1个回答

9

是的,这看起来像是与Postgres中数组类型处理相关的错误;这是特定于Postgres的,与您提到的“据称已修复”的帖子无关。说实话,我对Postgres数组不太了解 - 我记得那段代码来自用户贡献。如果您使用本地的Postgres语法,即

WHERE MyId = ANY(@myIds)

然而,我同意如果我们能让相同的语法在任何关系型数据库管理系统上都能工作将是很不错的。

实际上,这显示出这段代码中还有一个需要修复的错误(在FeatureSupport查找中)。


WHERE MyId = ANY(@myIds) 可以正常工作。重新编译并使用 FeatureSupport {Arrays = false} 也允许常规的 WHERE MyId IN @myIds 正常工作。(这是问题#150:https://github.com/StackExchange/dapper-dot-net/issues/150) - Jacob Krall
这个限制只针对1000行吗? - Kody
它对我不起作用:Npgsql.PostgresException (0x80004005):22P03:无效的数组标志;有什么想法吗? - MuriloKunze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接