【问题标题】:AutoMapper graceful handling of NULLAutoMapper 优雅处理 NULL
【发布时间】:2016-11-02 21:53:54
【问题描述】:

我正在将一个嵌套非常深的实体映射到一个扁平的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));

【问题讨论】:

    标签: automapper


    【解决方案1】:

    我认为 AutoMapper 实际上会自动为您处理 null 这样的传播。你的例子:

    ForMember(s => s.Property, o => o.MapFrom(s => s.Parent.Child1.Child2.Child3.Property)
    

    如果任何中间成员是null,则应该解析为null(我认为)。

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

    【讨论】:

    • 这很有趣,如果它有效......真的没想到它。我试一试——你认为它会如何以这种方式处理延迟加载的属性?
    • 你说得对!没想到会这样,但我很高兴它有效。谢谢!
    • 如果像我一样你需要做一些更复杂的事情,比如某个字段的 Math.Max 并且你想要有默认值,那么创建一个静态方法似乎也可以这样工作: ForMember(s => s.Property, o => o.MapFrom(s => CustomFunction(s))
    • 这主要适用于我,我将它用于空合并,但对于子列表并使用 FirstOrDefault 例如的情况,它似乎不起作用(对我来说)。 s => s.Parent.Child1.FirstOrDefault().Property ?? “一些默认值”。我可以看到它在自动映射器之外是如何失败的,因为访问 null 的“属性”会中断,但在自动映射器中似乎忽略了 null 合并而只返回 null。为什么会这样?
    【解决方案2】:

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

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

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

    示例 https://dotnetfiddle.net/Ecovrp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多