具有动态模型的 Dapper ORM - 如何不返回字段而不是“字段”= NULL?

Posted

技术标签:

【中文标题】具有动态模型的 Dapper ORM - 如何不返回字段而不是“字段”= NULL?【英文标题】:Dapper ORM with dynamic model - How to return no field instead of 'Field' = NULL? 【发布时间】:2014-05-21 16:24:10 【问题描述】:

我正在使用带有动态返回模型对象的 dapper,我想将其配置为“跳过”为空的字段。

例如,而不是:

[0]: DapperRow, Type = 'PHYS', Street1 = NULL, Street2 = NULL, State = CO

我希望 Dapper 回来

[0]: DapperRow, Type = 'PHYS', State = CO

这在功能上类似于 JSON.Net 的“NullValueHandling 设置”功能。

这是否可以在不改变底层 SQL 查询的情况下实现?

好处是减少我的(最终)JSON 对象的大小,该对象从 Dapper 的结果集中序列化并返回给 API 客户端。

(这是与this one 不同的问题,因为我使用的是动态模型类)

【问题讨论】:

这听起来不受欢迎; “以空值存在”与“不存在”不同。此外,dapper 与动态一起工作的方式意味着这不是微不足道的。 【参考方案1】:

基础类型 DapperRow 实现了 IDictionary,因此您可以强制转换为该接口并使用删除函数。以下扩展方法在我的测试中运行良好:

public static class DapperRowExtensions

    public static IEnumerable<dynamic> RemoveNullParams(this IEnumerable<dynamic> rows)
    
        foreach (var row in rows)
        
            var item = (IDictionary<string, object>)row;
            foreach (var key in item.Keys.ToList())
            
                if (item[key] == null)
                    item.Remove(key);
            
        
        return rows;
    

然后您将在查询结果中使用它:

var result = connection.Query("SELECT...");
return result.RemoveNullParams();

【讨论】:

以上是关于具有动态模型的 Dapper ORM - 如何不返回字段而不是“字段”= NULL?的主要内容,如果未能解决你的问题,请参考以下文章

使用对象角色建模 (ORM) 的关系模型中的动态类型

Dapper-小型ORM之王(C#.NET)

.net ORM框架(Dapper简单应用)

Dapper扩展Dapper.Common框架 Linq To Sql 底层源码.net ORM框架

使用SqlSugar结合MySql开发

轻量级高性能ORM框架:Dapper高级玩法