我正在使用EntityFramework 6.2.0和Automapper 6.2.2。我需要将实体Cart
映射到CartDto
。 CartDto
具有属性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();
答案 0 :(得分:0)
这不是AutoMapper不允许的,它是实体框架。 AutoMapper仅需要您的映射配置,并为基础查询提供程序构建一个Select
LINQ表达式。
在您的情况下,基础查询提供程序是Entity Framework,毫不奇怪,它不了解任何随机方法以及如何将该方法转换为SQL。 EF可以理解一些方法,例如Count,Sum,一些string / DateTime / primitive方法,但仅此而已。
因此异常消息非常准确-EF无法理解您提供的该方法,因此无法将该方法转换为SQL。
但是,如果您签出AutoMapper.EF6 package,可能会有希望。它包含DelegateDecompiler
程序包,该程序包使用IL检查来查看您的方法执行什么操作,对其进行反编译并将结果作为表达式传递给查询提供程序。
如果这看起来很复杂,那么在继续之前您最好了解LINQ的工作原理。