我有这样的东西:
Mapper.CreateMap<UserProfile, UserDTO>()
.ForMember(t => t.UserImage, s => s.MapFrom(x => x.Picture(32)))
.ForMember(t => t.Permalink, s => s.MapFrom(x => x.Permalink()));
我试着这样做:
unit.UserProfiles.GetAll().Project().To<UserDTO>().First();
我得到的是:
LINQ to Entities does not recognize the method 'System.String Picture(xx.xxx.UserProfile, Int32)' method, and this method cannot be translated into a store expression.
我想告诉automapper项目地图的每一个属性,然后这两个,查询完成后映射这两个在正常的方式,它是可行的吗?
你问错问题了。您确实需要问"我的底层查询提供程序如何将一些投影推迟到可查询对象完成其工作之后"。这将涉及实体框架需要支持的两步过程。下面是没有AutoMapper的代码:
unit.UserProfiles.Select(profile => new UserDTO {
Id = profile.Id, // I made these two up
Name = profile.Name,
UserImage = profile.Picture(32),
Permalink = profile.Permalink()
}).First();
EF将如何解释这一点?我想不太好吧。可能是个例外。如果你想在EF中这样做,你需要这样做:
unit.UserProfiles.Select(profile => new UserDTO {
Id = profile.Id, // I made these two up
Name = profile.Name
UserImage = profile.UserImage,
Slug = profile.Slug
}).First();
然后将创建图片的逻辑作为UserDTO的一部分。
或者,您只需将User取出,然后再进行映射。这里的关键是,AutoMapper只创建一个Select投影,由底层查询提供程序来适当地处理它。AutoMapper无法猜测支持或不支持什么,也无法知道如何解析源类型上的自定义方法,以及需要从SQL中获取哪些数据。
首先问一下-我如何在EF中使用Select投影来完成这一点?然后AutoMapper将负责封装该投影。