如何让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
相关产品推荐
相关产品推荐

