我需要从数据库到模型实体进行投影。在获取数据库中的数据并映射到具有单词和reposy的实体的实体之前:
public async Task<IEnumerable<Entity>> GetProjectsSponsorByYear(Guid idUser)
{
logger.Trace("Called GetProjectsSponsorByYear method in ProjectBusiness");
var Entitys = await this.unitOfWork.Repository<Entity>().Queryable().Where(p => p.SponsorId == idUser && p.Draft == true).ToListAsync();
return listProjectDataBaseAsModel;
之后,使用automapper在Entity和model之间创建一个映射:
this.CreateMap<Entity, Model>()
.ForMember(dest => dest.ID, opt => opt.MapFrom(src => src.ID))
.ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title))
public async Task<IEnumerable<Model>> GetProjectHistoricList()
{
logger.Trace("Called GetProjectHistoricList method in ProjectService");
var allProjects = await this.projectBusiness.GetAll();
var allProjectsGrid = this.entityMapper.Map<IEnumerable<Entity>, IEnumerable<Model>>(allProjects);
return allProjectsGrid;
}
但是现在我需要从数据库到模型实体进行投影,问题是当使用createMap时,对于配置automapper,我有方法属性
.ForMember(dest => dest.ImpactSupervisorDescription, opt => opt.MapFrom(src => src.ImpactSupervisor.GetDescription()))
当使用ProjectTo方法在存储库和模型之间进行投影时,从Linq获取Exection。 我知道这个例子是为Linq创建一个查询而不是将这个方法实现到她身上。
在投影之前或之后,需要知道是否有任何方法可以实现这一点。
答案 0 :(得分:0)
查看AutoMapper.EF6项目,它使用另一个项目DelegateDecompiler,根据方法和属性内容构建投影。它检查IL并构建一个表达式以匹配该IL,然后传递给您的可查询提供者:
https://www.nuget.org/packages/AutoMapper.EF6/
然后您可以直接从可查询项目投射到列表:
var allProjectsGrid = await this.projectBusiness.GetAll()
.ProjectToListAsync<Model>();
作为旁注,你不需要那些ForMember对ID和Title的调用,这是AutoMapper的Auto部分:)