Dapper查询结果怎么忽略某个属性 Dapper映射忽略列的方法

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

dapper查询结果怎么忽略某个属性 dapper映射忽略列的方法

Dapper 默认会将查询结果的每一列映射到目标类的同名公共属性上,如果想让某个属性不参与映射(即忽略数据库中某列,或不让类中某个属性被赋值),有几种常用且可靠的方式。

使用 `[JsonIgnore]` 或自定义特性不生效?注意:Dapper 不识别 JSON 相关特性

Dapper 本身不读取 `[JsonIgnore]`、`[XmlIgnore]` 或 `[NonSerialized]` 这类序列化相关特性。它只认自己支持的映射控制方式,所以不能依赖这些来跳过属性映射。

方法一:SQL 层面排除不需要的列(推荐)

最直接、高效、无歧义的做法是在 SQL 中明确列出需要的字段,而不是用 `SELECT *`。

  • ✅ 避免传输冗余数据,提升性能
  • ✅ 明确意图,防止因表结构变更导致映射异常
  • ❌ 缺点是需手动维护字段列表,但这是值得的权衡

示例:

C#

var users = connection.Query("SELECT Id, Name, Email FROM Users WHERE Active = 1");

假设 User 类还有 PasswordHash 属性,只要 SQL 没查它,Dapper 就不会给它赋值(保持默认值,如 nulldefault)。

Detect GPT

Detect GPT

一个Chrome插件,检测您浏览的页面是否包含人工智能生成的内容

下载

方法二:用匿名类型或 `QueryMultiple` 灵活控制

如果只是临时忽略某些字段,或者想组合不同查询结果,可用匿名对象接收:

var result = connection.Query("SELECT Id, Name FROM Users").ToList(); // 返回 dynamic 或匿名对象

或者用 QueryMultiple 分步查,只映射关心的部分。

方法三:自定义 `IMapper`(高级,少用)

Dapper 支持通过 `SqlMapper.AddTypeHandler` 或实现 `IMapper` 来接管映射逻辑,但对“忽略单个属性”来说过于重量级,一般项目无需这么做。除非你有统一的字段过滤规则(如所有 `*At` 时间字段都忽略),才考虑封装映射器。

基本上就这些。日常开发中,**优先用 SQL 显式列名**,既清晰又稳定;避免依赖特性或运行时反射干预,默认行为已足够简洁可靠。

https://www.php.cn/faq/2010243.html

发表回复

Your email address will not be published. Required fields are marked *