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

如何让Dapper查询映射支持大小写不敏感(Oracle+驼峰命名场景)

当然可以用Dapper解决这个大写列名到驼峰属性的映射问题,而且有几种不同的方案,完全能适配你提到的复杂查询、自定义映射和splitOn的场景,下面给你详细说说:

方案一:针对单个实体配置大小写忽略映射

如果只是特定实体(比如你的Job类)需要这种映射,可以在应用启动时给该类型单独设置自定义属性匹配规则:

// 应用初始化时执行一次即可
SqlMapper.SetTypeMap(typeof(Job), new CustomPropertyTypeMap(
    typeof(Job),
    (type, columnName) => type.GetProperty(
        columnName,
        BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance
    )
));

这样Dapper在映射Job类型时,会忽略列名和属性名的大小写差异,Oracle返回的ISACTIVE就能正确对应到代码里的IsActive属性了,你的原查询语句SELECT m.* FROM Table1完全不用改。

方案二:全局配置所有实体的大小写忽略映射

如果你的项目里大部分实体都需要这种大小写不敏感的映射,可以自定义一个全局的类型映射器:

public class CaseInsensitiveTypeMap : DefaultTypeMap
{
    public CaseInsensitiveTypeMap(Type type) : base(type)
    {
    }

    protected override PropertyInfo GetProperty(string columnName)
    {
        // 忽略大小写查找对应的属性
        return this.Type.GetProperty(columnName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
    }
}

// 在应用启动时设置全局默认
SqlMapper.SetDefaultTypeMapProvider(type => new CaseInsensitiveTypeMap(type));

配置完成后,所有实体类型都会自动忽略列名和属性名的大小写,不用逐个实体配置,非常省心。

结合自定义映射与splitOn的情况

如果你已经在使用splitOn参数拆分多实体结果,完全不用担心冲突——只要配置了上述的大小写忽略规则,你只需要在splitOn里传入数据库的大写列名(比如splitOn: "JOB_ID,EMPLOYEE_ID"),Dapper会自动忽略大小写匹配到对应的实体属性上,完全不影响拆分逻辑。

额外补充:兼容下划线命名的场景

如果你的Oracle列名还有下划线(比如IS_ACTIVE),同时需要映射到驼峰的IsActive,可以再加上这一行配置:

DefaultTypeMap.MatchNamesWithUnderscores = true;

这会让Dapper自动将下划线分隔的列名转换为驼峰命名,同时结合大小写忽略,覆盖更多场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:17:55