告诉 AutoMapper 一个字段是顶级成员

Tell AutoMapper that a field is a top-level member

我正在尝试使用 AutoMapper.QueryableExtensions

来减轻在 AutoMapper 中创建映射表达式的痛苦

我有以下内容,它提供了关键的性能提升:

    private MapperConfiguration CreateConfiguration() {
        return new MapperConfiguration(cfg => cfg.CreateMap<Widget, WidgetNameDto>()
        .ForMember(dto => dto.Name,
            conf => conf.MapFrom(w => w.Name)));
    }

要了解性能提升,请参阅此处:https://github.com/AutoMapper/AutoMapper/blob/master/docs/Queryable-Extensions.md关键是查询在数据库级别受字段限制。

这很有效。但我预计需要做很多这种预测。我试图从上面的 ForMember 子句中的语法中消除一些痛苦。

例如,我试过这个:

    public static IMappingExpression<TFrom, TTo> AddProjection<TFrom, TTo, TField>(this IMappingExpression<TFrom, TTo> expression,
        Func<TFrom, TField> from,
        Func<TTo, TField> to
        )
        => expression.ForMember(t => to(t), conf => conf.MapFrom(f => from(f)));

问题是我所做的一切都会出错:

AutoMapper.AutoMapperConfigurationException : Custom configuration for members is only supported for top-level individual members on a type.

即使传入的Funcs是顶级个体成员,这个事实在传递中丢失了,所以我报错了。我还尝试将 Func 更改为 Expression>。没用。

有什么方法可以简化 ForMember 子句的语法吗?理想情况下,我只传递两个相关字段。

首先,不需要为按名称匹配的 fields/properties 添加映射 - AutoMapper 按照约定自动映射它们(这就是为什么它被称为 convention-based object-object映射器)。为了在投影中仅包含一些属性,您可以使用 Explicit expansion 功能。

其次,您在 ForMember 语法 中所谓的 痛苦实际上是一种灵活性。例如,显式扩展和其他行为可以通过 conf 参数来控制,因此它不仅用于指定源。

话虽这么说,你问的是可能的。您必须将 from/ to 类型更改为 Expression:

 Expression<Func<TFrom, TField>> from,
 Expression<Func<TTo, TField>> to

实现简单如下:

=> expression.ForMember(to, conf => conf.MapFrom(from));