Dapper 默认按列名映射到同名公共属性,忽略某列应优先在SQL中显式指定字段;不支持JsonIgnore等序列化特性;也可用匿名类型或QueryMultiple灵活控制,自定义IMapper属高级用法。

Dapper 默认会将查询结果的每一列映射到目标类的同名公共属性上,如果想让某个属性不参与映射(即忽略数据库中某列,或不让类中某个属性被赋值),有几种常用且可靠的方式。
使用 `[JsonIgnore]` 或自定义特性不生效?注意:Dapper 不识别 JSON 相关特性
Dapper 本身不读取 `[JsonIgnore]`、`[XmlIgnore]` 或 `[NonSerialized]` 这类序列化相关特性。它只认自己支持的映射控制方式,所以不能依赖这些来跳过属性映射。
方法一:SQL 层面排除不需要的列(推荐)
最直接、高效、无歧义的做法是在 SQL 中明确列出需要的字段,而不是用 `SELECT *`。
- ✅ 避免传输冗余数据,提升性能
- ✅ 明确意图,防止因表结构变更导致映射异常
- ❌ 缺点是需手动维护字段列表,但这是值得的权衡
示例:
C#var users = connection.Query
假设 User 类还有 PasswordHash 属性,只要 SQL 没查它,Dapper 就不会给它赋值(保持默认值,如 null 或 default)。
方法二:用匿名类型或 `QueryMultiple` 灵活控制
如果只是临时忽略某些字段,或者想组合不同查询结果,可用匿名对象接收:
var result = connection.Query("SELECT Id, Name FROM Users").ToList(); // 返回 dynamic 或匿名对象
或者用 QueryMultiple 分步查,只映射关心的部分。
方法三:自定义 `IMapper`(高级,少用)
Dapper 支持通过 `SqlMapper.AddTypeHandler
基本上就这些。日常开发中,**优先用 SQL 显式列名**,既清晰又稳定;避免依赖特性或运行时反射干预,默认行为已足够简洁可靠。










