2017-02-17 3 views
0

Мне нужна проекция из базы данных в модель объекта. Перед тем как получить данные в базе данных и сопоставить Entity с единицей слова и reposy:Проецирование с Automapper

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 для создания карты между Сущностью и моделью:

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 get Exection от Linq. Я знаю, что это выделение для Linq создает запрос и не реализует этот метод в ней.

Необходимо знать, есть ли способ достичь этого, до или после проекции.

ответ

0

Проверьте проект AutoMapper.EF6, он использует другой проект DelegateDecompiler для построения прогнозов на основе метода и содержимого свойств. Она рассматривает IL и строит выражение, совпадающее IL, чтобы затем перейти к поставщику запрашиваемых:

https://www.nuget.org/packages/AutoMapper.EF6/

Затем вы можете проецировать прямо из Queryable в список:

var allProjectsGrid = await this.projectBusiness.GetAll() 
           .ProjectToListAsync<Model>(); 

И как обратите внимание, что вам не нужны те вызовы ForMember для ID и Title, это Auto part of AutoMapper :)

+0

Спасибо за anwer :), Если бы я хотел сделать проекцию в метод getAll(), например, это путь: "Репозиторий () .Queryable(). ProjectTo () .ToListAsync() ";, я могу использовать метод ProjectToListAsync ??? –

+0

Да, вы можете! Он выполняет ProjectTo и ToList, но также добавляет, что декомпилятор делегата находится посередине: https://lostechies.com/jimmybogard/2015/07/08/entity-framework-extensions-for-automapper/ –