AutoMapper 优雅地处理 NULL
AutoMapper graceful handling of NULL
我正在将嵌套很深的实体映射到扁平化的 Dto
对象,想知道如何使用 AutoMapper 优雅地处理这个问题。我知道我可以在映射时对每个 属性 进行 null 检查,但是对于像这样的事情,这会变得非常丑陋:
ForMember(s => s.Property, o => o.MapFrom(s => s.Parent.Child1.Child2.Child3.Property)
所以我想我可以对同一个目标对象使用各种地图配置...但是由于对 AutoMapper 的使用相对不熟练,我不确定这对性能有何影响。我还有什么其他更好的方法来实现我想要的?
重申一下,我希望避免这样的事情(我知道下面的代码可能无法编译...这只是一个例子)我必须为 每个 成员做这件事:
ForMember(s => s.Property, o => o.MapFrom(
s => s.Parent == null ? string.Empty :
s => s.Parent.Child1 == null ? string.Empty :
s => s.Parent.Child1.Child2 == null ? string.Empty :
s => s.Parent.Child1.Child2.Child3 == null ? string.Empty :
s => s.Parent.Child1.Child2.Child3.Property));
我认为 AutoMapper 实际上会像这样自动为您处理 null
传播。你的例子:
ForMember(s => s.Property, o => o.MapFrom(s => s.Parent.Child1.Child2.Child3.Property)
应该解析为null
(我认为),如果任何中间成员是null
。
虽然这适用于单个实例,但不适用于可查询集合上的投影。
即使在最新的 5.1.1 版本中,我添加到 Andrew 答案中的附加代码也失败了。
var list = new List<Source>();
list.Add(new Source());
list.AsQueryable().ProjectTo<Dest>().Dump();
我正在将嵌套很深的实体映射到扁平化的 Dto
对象,想知道如何使用 AutoMapper 优雅地处理这个问题。我知道我可以在映射时对每个 属性 进行 null 检查,但是对于像这样的事情,这会变得非常丑陋:
ForMember(s => s.Property, o => o.MapFrom(s => s.Parent.Child1.Child2.Child3.Property)
所以我想我可以对同一个目标对象使用各种地图配置...但是由于对 AutoMapper 的使用相对不熟练,我不确定这对性能有何影响。我还有什么其他更好的方法来实现我想要的?
重申一下,我希望避免这样的事情(我知道下面的代码可能无法编译...这只是一个例子)我必须为 每个 成员做这件事:
ForMember(s => s.Property, o => o.MapFrom(
s => s.Parent == null ? string.Empty :
s => s.Parent.Child1 == null ? string.Empty :
s => s.Parent.Child1.Child2 == null ? string.Empty :
s => s.Parent.Child1.Child2.Child3 == null ? string.Empty :
s => s.Parent.Child1.Child2.Child3.Property));
我认为 AutoMapper 实际上会像这样自动为您处理 null
传播。你的例子:
ForMember(s => s.Property, o => o.MapFrom(s => s.Parent.Child1.Child2.Child3.Property)
应该解析为null
(我认为),如果任何中间成员是null
。
虽然这适用于单个实例,但不适用于可查询集合上的投影。
即使在最新的 5.1.1 版本中,我添加到 Andrew 答案中的附加代码也失败了。
var list = new List<Source>();
list.Add(new Source());
list.AsQueryable().ProjectTo<Dest>().Dump();