automapper如何全局配置map条件过滤null值空值对所有映射起效

原文 automapper如何全局配置map条件过滤null值空值对所有映射起效

我们在使用automapper的时候经常会遇到这样的问题:假设展示给用户的数据我们用UserDto类,User类就是我们的实体类。在给用户编辑的时候,我们可能某些字段在数据库中为Null,这时候需要一些默认值 比如这里UserDto中的BirTime,然后我们有一些人的习惯是在构造函数里面进行赋值

  public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public  DateTime? BirTime{ get; set; }
    }

   public class UserDto
    {
         public UserDto()
        {
             this.BirTime=DateTime.Now;//把当前时间赋值给BirTime
        }
        public string Name { get; set; }
        public  DateTime? BirTime{ get; set; }
    }

 //假设我们从数据库中取出来的值是这样的,然后我们要和UserDto之间进行转换
   User user = new User()
    {
        Id = 1,
        Name = "caoyc",
        BirTime=null
    };
  UserDto userDto=user.MapTo<UserDto>();//这里把实体类转换成前台给用户展示的UserDto类

看似这里的代码都没有什么问题,但是我想在BirTime为null值的时候使用我UserDto类中的默认值 也就是当前时间,但在实际操作之后就会发现转换过后的UserDto的值已经变掉了。那么问题来了, 如何才能使用默认值呢。

方法有很多,比如

//第一种方法
UserDto userDto=user.MapTo<UserDto>();//这里把实体类转换成前台给用户展示的UserDto类
userDto.BirTime=userDto.BirTime==null?DateTime.Now:userDto.BirTime;

第一种方法就是在自己转换完成之后判断一下,然后重新赋值,用这种方法的话那写构造函数自然就没什么必要了

//第二种方法
Mapper.CreateMap<User, UserDto>().ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));

第二种方法不怎么好,当你需要转换的类很多的时候,每个都要这样写,会很多也会很烦

//第三种方法,在全局配置的时候加上这句话
private static void CreateMappingsInternal(IMapperConfigurationExpression cfg)
{
     //没错就是这句话
     cfg.ForAllMaps((a, b) => b.ForAllMembers(opt => opt.Condition((src, dest, sourceMember) => sourceMember != null)));
}

个人比较推荐第三种方法,不过这就相当于一棒子打死了,有利也有弊。

作者:邵佳楠
链接:https://www.jianshu.com/p/c691a20adf2b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/lonelyxmas/p/9919777.html

时间: 2024-10-10 22:34:51

automapper如何全局配置map条件过滤null值空值对所有映射起效的相关文章

jackson 转json. 过滤null值

@Test public void tttttt() throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper mapper = new ObjectMapper(); // 过滤对象的null属性. mapper.setSerializationInclusion(Inclusion.NON_NULL); // 过滤map中的null值 mapper.configure(Serializat

SqlServer中的Null值空值问题

原文:SqlServer中的Null值空值问题 sql使用的是三值谓词逻辑,所以逻辑表达式返回的结果可以为True.False或者未知,在三值逻辑中返回True与不返回False并不完全一样, SQL对查询过滤条件的处理:接受TURE  拒绝FALSE和UnKnown SQL对CHECK约束的处理:接受FALSE 拒绝 TRUE和UNKnown UNKNOWN的微妙之处在于当对它取反时  结果仍是UNKNOWN, 对两个Null值进行比较的表达式(Null=null),其计算的结果仍为Unkno

JSON序列化自己主动过滤NULL值

使用Newtonsoft.Json.dll 序列化为json时主动将NULL值过滤掉.详细做法: var jSetting = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}; var json = JsonConvert.SerializeObject(response, Formatting.Indented, jSetting); 之前转换的JSON为: {"header":{&q

JSON序列化自动过滤NULL值

使用Newtonsoft.Json.dll 序列化为json时主动将NULL值过滤掉,具体做法: var jSetting = new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}; var json = JsonConvert.SerializeObject(response, Formatting.Indented, jSetting); 之前转换的JSON为: {"header":{&q

hive对有null值的列进行avg,sum,count等操作时会不会过滤null值

在hive中,我们经常会遇到对某列进行count.sum.avg等操作计算记录数.求和.求平均值等,但这列经常会出现有null值的情况,那这些操作会不会过滤掉null能呢? 下面我们简单测试下: with tmp as(select null as col1 union allselect 666 as col1 union allselect 999 as col1)select avg(col1) avg_numm, sum(col1) sum_num, count(1) cnt, coun

直接使用提交过来的类来更新字段EntityState.Modified并过滤null值的方法

public T Update<T>(T entity) where T : ModelBase { var set = this.Set<T>(); set.Attach(entity); foreach (System.Reflection.PropertyInfo p in entity.GetType().GetProperties()) { if (p.GetValue(entity) != null) { this.Entry<T>(entity).Prop

oracle查询不等于条件包含null值

需求:现在oracle数据库中有字段is_use 的值有:null,0,1,2.现在需要查询不等于2的数据 解决办法的sql: select * from uc_Users where nvl(is_use,'xx')<>'2' ======================================= nvl(is_use,'xx')的意思是:如果is_use为null,值为xx. 如果用select * from uc_Users where is_use<>'2' 只会查

iOS开发——model类模板(过滤null和ID)

        说明:model类模板已默认过滤null值,附加特殊情况的关键字ID名的冲突(需手动去掉注释代码).MyMessageModel为示例的名字.可以自己随便起. 1.自己创建一个继承与NSObject的类,用于当model数据模型用.然后在.h文件中根据接口文档或者json返回数据的添加相应属性.    并复制以下model类模板代码.h文件的- (instancetype)initWithDictionary:(NSDictionary *)dictionary;方法到自己创建的

Map 转 json格式 保留null值的解决办法

开发中遇到将map数据转json格式,然后map中含null值的键值对都被转没了,所以记录一下,以下是解决方法 使用fastJson进行转换 import com.alibaba.fastjson.JSON Map<String, Object> map = new HashMap<String, Object>(); String toJSON = JSON.toJSONString(map, SerializerFeature.WRITE_MAP_NULL_FEATURES,