Automapper ProjectTo不允许将属性映射到自定义方法

时间:2018-08-24 14:00:09

标签: linq entity-framework-6 automapper automapper-6

我正在使用EntityFramework 6.2.0和Automapper 6.2.2。我需要将实体Cart映射到CartDtoCartDto具有属性Total,该属性需要映射到Cart.GetTotal()的结果。我想使用.ProjectTo来简化查询,但是如果这样做,我会收到错误消息:

LINQ to Entities does not recognize the method GetTotal()

因为投影使用IQueriable并且该方法在SQL中没有转换。有什么办法可以解决这个问题?

var automapperConfiguration = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Cart, CartDto>()
       .ForMember(x => x.Total, o => o.MapFrom(x => x.GetTotal()))
       .ForAllOtherMembers(x => x.Ignore());
});

var cartDto = dbContext.Carts
                       .ProjectTo<CartDto>(automapperConiguration)
                       .FirstOrDefault();

1 个答案:

答案 0 :(得分:0)

这不是AutoMapper不允许的,它是实体框架。 AutoMapper仅需要您的映射配置,并为基础查询提供程序构建一个Select LINQ表达式。

在您的情况下,基础查询提供程序是Entity Framework,毫不奇怪,它不了解任何随机方法以及如何将该方法转换为SQL。 EF可以理解一些方法,例如Count,Sum,一些string / DateTime / primitive方法,但仅此而已。

因此异常消息非常准确-EF无法理解您提供的该方法,因此无法将该方法转换为SQL。

但是,如果您签出AutoMapper.EF6 package,可能会有希望。它包含DelegateDecompiler程序包,该程序包使用IL检查来查看您的方法执行什么操作,对其进行反编译并将结果作为表达式传递给查询提供程序。

如果这看起来很复杂,那么在继续之前您最好了解LINQ的工作原理。