У меня проблема с ProjectTo
. У меня есть карта выбора:
var posts = await appContext.Posts
.Select(x => new PostListReadModel()
{
IsAnonymous = x.IsAnonymous,
Publisher = !x.IsAnonymous ?
new PostPublisherReadModel()
{
Id = x.PublisherId,
Nick = x.Publisher.Nick,
PhoneNumber = x.Publisher.PhoneNumber,
Avatar = x.Publisher.Avatar
} :
null
})
.ToListAsync();
Как видите, у меня есть условие сопоставления для свойства Publisher
. Очень простое условие. Это переводится как sql так:
SELECT p.IsAnonymous, NOT (p.IsAnonymous), p.PublisherId, u.Nick, u.PhoneNumber, i.Id, i.DateCreated, i.DateUpdated, i.FileName
FROM posts AS p
INNER JOIN users AS u ON p.PublisherId = u.Id
LEFT JOIN images AS i ON u.AvatarId = i.Id
И это работает.
Теперь я хочу использовать ProjectTo
. И у меня есть конфигурация карты, подобная этой:
CreateMap<User, PostPublisherReadModel>();
CreateMap<Post, PostListReadModel>()
.ForMember(dest => dest.IsAnonymous, opt => opt.MapFrom(src => src.IsAnonymous))
.ForMember(dest => dest.Publisher, opt => opt.Condition(src => !src.IsAnonymous))
.ForAllOtherMembers(opt => opt.Ignore());
Она переводится в sql следующим образом:
SELECT p.IsAnonymous, FALSE, i.Id, i.DateCreated, i.DateUpdated, i.FileName, u.Id, u.Nick, u.PhoneNumber
FROM posts AS p
INNER JOIN users AS u ON p.PublisherId = u.Id
LEFT JOIN images AS i ON u.AvatarId = i.Id
и, естественно, не работает.
Это ошибка автомата или я делаю что-то не так? PS: DbProvider: Pomelo.EntityFrameworkCore. MySql Версия = 3.1.0