AutoMapper优雅地处理NULL

时间:2015-03-24 10:10:29

标签: automapper

我正在将一个非常深层嵌套的实体映射到一个扁平的Dto对象,并想知道我如何使用AutoMapper优雅地处理它。我知道我可以对每个属性进行无效检查,因为它被映射,但是对于像以下这样的事情来说会非常难看:

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));

2 个答案:

答案 0 :(得分:6)

我认为AutoMapper会自动为您自动处理null传播。你的例子:

ForMember(s => s.Property, o => o.MapFrom(s => s.Parent.Child1.Child2.Child3.Property)
如果任何中间成员是null,则

应解析为null(我认为)。

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

答案 1 :(得分:0)

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

我添加到安德鲁的答案中的这个附加代码失败了,即使在最新的5.1.1版本上也是如此。

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

示例 https://dotnetfiddle.net/Ecovrp