使用Automapper进行投影

时间:2017-02-17 20:52:37

标签: c# automapper

我需要从数据库到模型实体进行投影。在获取数据库中的数据并映射到具有单词和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创建一个查询而不是将这个方法实现到她身上。

在投影之前或之后,需要知道是否有任何方法可以实现这一点。

1 个答案:

答案 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部分:)