如何在Dapper中使用PostgreSQL数组重叠运算符&&?
解决方案:Dapper + PostgreSQL 数组&&操作符报错问题
问题原因
你遇到的错误是因为Dapper传递string[]参数时,Npgsql默认未正确将其映射为PostgreSQL的text[]类型,导致参数被识别为record或record[],与name字段的text[]类型不兼容,触发了操作符不存在的错误。
可行解决方案
方案1:SQL中显式转换参数类型
直接在SQL里将@name参数转换为text[]类型,无需修改C#代码的参数传递逻辑:
SELECT name FROM people WHERE @name::text[] && name
方案2:指定参数的数据库类型
在C#代码中传递参数时,明确指定参数类型为text[],让Npgsql正确识别:
var parameters = new DynamicParameters(); // 方式1:使用通用DbType parameters.Add("name", new[] { "John", "Sue" }, DbType.StringArray); // 方式2:使用Npgsql专属类型(更推荐) parameters.Add("name", new[] { "John", "Sue" }, NpgsqlDbType.TextArray); // 执行查询 var result = await connection.QueryAsync<string>("SELECT name FROM people WHERE @name && name", parameters);
注意事项
- 不要用
ARRAY[@name]包裹参数,这会把原本的一维数组变成二维的record[]类型,完全不符合预期。 - 确保
people表中的name字段类型是text[];如果name是单个text类型,原SQL的&&操作本身逻辑不合理,应改用name = ANY(@name)实现匹配。
内容的提问来源于stack exchange,提问作者Daniel Matthews
相关产品推荐
相关产品推荐

