You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQL WHERE子句中的Dapper参数区分大小写?

Dapper参数与PostgreSQL citext的大小写敏感问题:原因及解决方案

问题原因

PostgreSQL的citext类型本身是大小写不敏感的,但当你用Dapper传递.NET字符串参数时,Dapper默认会将其映射为PostgreSQL的text类型。此时citext字段和text参数做比较时,PostgreSQL会采用text的大小写敏感规则进行匹配,而非citext的规则。

而直接使用字符串字面量时,PostgreSQL会自动将字面量隐式转换为citext类型(因为目标字段是citext),所以会触发大小写不敏感的比较逻辑,自然能查到结果。

解决方案

1. 在SQL中显式转换参数为citext类型

这是最简单直接的方法,在WHERE子句里把参数强制转成citext,让比较逻辑遵循citext的规则:

SELECT * FROM recipe WHERE name = @Name::citext

2. 配置Dapper参数的类型为citext

在传递参数时,明确指定参数的PostgreSQL类型为citext,让Dapper正确映射类型:

方式一:使用DynamicParameters指定类型

var sql = "SELECT * FROM recipe WHERE name = @Name";
var parameters = new DynamicParameters();
// 最后一个参数指定PostgreSQL类型为citext
parameters.Add("Name", "Meatballs", DbType.String, ParameterDirection.Input, null, "citext");
var recipe = connection.QueryFirstOrDefault<Recipe>(sql, parameters);

方式二:使用NpgsqlParameter指定类型

var sql = "SELECT * FROM recipe WHERE name = @Name";
var param = new NpgsqlParameter("Name", NpgsqlDbType.Citext) 
{ 
    Value = "Meatballs" 
};
var recipe = connection.QueryFirstOrDefault<Recipe>(sql, param);

3. 全局配置字符串到citext的映射(谨慎使用)

如果你的数据库中大部分字符串字段都是citext,可以全局配置Npgsql,让所有.NET字符串参数默认映射为citext类型。注意这种方式会影响所有数据库操作,需确认不会破坏其他使用text类型的场景:

// 在应用启动时(如Program.cs)添加该配置
NpgsqlConnection.GlobalTypeMapper.MapClrType<string>(NpgsqlDbType.Citext);

内容的提问来源于stack exchange,提问作者zwoolli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:45:33