Automapper ProjectTo не позволяет сопоставлять свойства с пользовательскими методами - PullRequest
0 голосов
/ 24 августа 2018

Я использую 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();

1 Ответ

0 голосов
/ 24 августа 2018

Это не AutoMapper, не позволяющий это, это Entity Framework.AutoMapper просто берет вашу конфигурацию сопоставления и создает выражение Select LINQ для основного поставщика запросов.

В вашем случае базовым поставщиком запросов является Entity Framework, который неудивительно, что не поймет какой-либо случайный метод и какперевести этот метод в SQL.EF понимает несколько методов, таких как Count, Sum, некоторые методы string / DateTime / primitive, но это все.

Таким образом, сообщение об исключении достаточно точное - EF не понимает этот метод, который вы ему далии, следовательно, не имеет возможности перевести этот метод в SQL.

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

Если это кажется сложным, это так,так что перед тем, как продолжить, вам лучше понять, как работает LINQ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...