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

示例: https://dotnetfiddle.net/hMo3wa

虽然这适用于单个实例,但不适用于可查询集合上的投影。

即使在最新的 5.1.1 版本中,我添加到 Andrew 答案中的附加代码也失败了。

    var list = new List<Source>();
    list.Add(new Source());     
    list.AsQueryable().ProjectTo<Dest>().Dump();

示例 https://dotnetfiddle.net/Ecovrp