眼前多少难甘事,自古男儿当自强。这篇文章主要讲述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;
}
publicDateTime? BirTime{ get;
set;
}
}public class UserDto
{
public UserDto()
{
this.BirTime=DateTime.Now;//把当前时间赋值给BirTime
}
public string Name { get;
set;
}
publicDateTime? 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)));
}
【automapper如何全局配置map条件过滤null值空值对所有映射起效】个人比较推荐第三种方法,不过这就相当于一棒子打死了,有利也有弊。
作者:邵佳楠
链接:https://www.jianshu.com/p/c691a20adf2b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
推荐阅读
- Net系列框架-Dapper+简单三层架构
- 基本数据类型的包装类(wrapper class)时间处理相关类Math类File类枚举类
- 作为一名Android开发者,你有过迷茫吗
- App启动流程
- 第五章 Flask——实例化Flask的参数及对app的配置
- Object Relational Mapping(ORM)
- appium解决每次运行都需要安装Unlock以及AppiumSetting的问题
- Android开发 - 掌握ConstraintLayout偏差(Bias)
- 理解column must appear in the GROUP BY clause or be used in an aggregate function