Dapper执行QueryAsync映射时部分数据库有值的字段返回null如何解决
问题根因
你的字段返回null的核心原因是Dapper多映射的splitOn参数配置错误,其次还有字段别名和模型属性不匹配的问题:
- Dapper多映射规则是:
splitOn参数需要按顺序填写每个后续映射实体的第一个返回列名,多个列名用逗号分隔,你当前的配置顺序完全错误,导致字段被拆分到了错误的实体类中,自然对应实体的属性拿到的就是null。 - 你返回的
LastUpd列和EclipsePolicy类中的EclipseLastUpd属性名不匹配,也会导致该属性无法正确赋值。
具体修复方案
1. 修正splitOn参数配置
你现在的多映射是5个实体,顺序为EclipsePolicy→PolicyLines→ReportingClass→PolicyLimit→LineSize,对应的拆分点应该是后四个实体各自的第一个返回列,也就是:
// 原错误配置 splitOn: "PremiumCcy,SyndExposure,ReportingClass2,LimitCcyISO" // 修改为正确配置 splitOn: "SyndExposure,ReportingClass2,LimitCcyISO,LineSizePct"
注意:
PremiumCcy本身是EclipsePolicy的属性,不能作为第一个拆分点,你之前的配置把PremiumCcy划给了第二个实体PolicyLines,所以EclipsePolicy的PremiumCcy直接取不到值。
2. 修正SQL查询中的列别名
把SQL中最后计算的LastUpd字段别名修改为和模型属性一致:
-- 原写法 ) as LastUpd -- 修改为 ) as EclipseLastUpd
3. 可选适配可空字段
如果数据库中SyndEPI、SyndGrossEPI字段允许为null,把PolicyLines类中对应属性改为可空值类型,避免映射失败:
public class PolicyLines { public decimal? SyndEPI { get; set; } public decimal? SyndGrossEPI { get; set; } public string SyndExposure { get; set; } }
验证步骤
修改完成后先单独在数据库中执行你的SQL语句,确认PremiumCcy等几个字段确实有返回值,排除LEFT JOIN匹配不到返回null的情况,再运行代码测试映射即可。
内容的提问来源于stack exchange,提问作者Tejaswini Mahajan
相关产品推荐
相关产品推荐

