1

我正在使用实体框架 6.2.0 和 Automapper 6.2.2。我需要将实体映射CartCartDto. CartDto有一个属性Total需要映射到Cart.GetTotal(). 我想用它.ProjectTo来简化查询,但如果我这样做,我会收到错误:

LINQ to Entities does not recognize the method GetTotal()

因为投影使用IQueryable和方法在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();
4

1 回答 1

1

这不是 AutoMapper 不允许这样做,而是实体框架。AutoMapper 仅采用您的映射配置并将 LINQ 表达式构建Select到底层查询提供程序。

在您的情况下,底层查询提供程序是实体框架,不出所料,它不会理解任何随机方法以及如何将该方法转换为 SQL。EF 了解一些方法,例如 Count、Sum、一些字符串/日期时间/原始方法,但仅此而已。

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

但是,如果您查看AutoMapper.EF6 包,可能会有希望。它包括DelegateDecompiler使用 IL 检查来查看您的方法的功能、反编译并将结果作为表达式传递给查询提供程序的包。

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

于 2018-08-24T17:54:07.667 回答