AutoMapper выберите перевод выражения - PullRequest
0 голосов
/ 04 июня 2018

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

Я считаю, что отображение должно генерировать дословно выражение выбора для следующего, но я знаю, что нет,потому что, подставляя это выражение вместо проецирования с AutoMapper, все работает как положено (и ошибка исчезает).

dbContext.Blogs.Select(blog => new BlogDto { Post = blog.Posts.Any() ? blog.Posts.Select(post => new PostDto()).FirstOrDefault() : null })

public class Blog
{
    public Guid Id { get; set; }

    [InverseProperty(nameof(Post.Blog))]
    public virtual List<Post> Posts { get; } = new List<Post>();
}
public class Post
{
    public Guid Id { get; set; }
    public Guid BlogId { get; set; }

    [ForeignKey(nameof(BlogId))]
    public virtual Blog Blog { get; private set; }
}

public class BlogDto
{
    public PostDto Post { get; set; }
}
public class PostDto { }

public class BlogProfile : Profile
{
    public BlogProfile()
    {
        CreateMap<Blog, BlogDto>()
            .ForMember(x => x.Post, x => x.MapFrom(y => y.Posts.Any() ? y.Posts.FirstOrDefault() : null));
    }
}
public class PostProfile : Profile
{
    public PostProfile()
    {
        CreateMap<Post, PostDto>();
    }
}

TLDR Я пытаюсь понять, что (или как) выборочное выражение дословно будет сгенерировано AutoMapper с приведенным выше отображением.

1 Ответ

0 голосов
/ 10 июня 2018

Согласно предложению @LucianBargaoanu, чтобы получить точное select выражение, которое AutoMapper генерирует при использовании ProjectTo<>(), вам просто нужно вызвать context.Entities.ProjectTo<Dto>().Expression.ToString().Было выражение IIF в выражении, которое я только что перевел в троичное выражение.

Для опубликованных отображений вывод ToString() был следующим:

value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[EFCoreBugs.Blog]).Select(dtoBlog => new BlogDto() {Post = IIF((IIF(dtoBlog.Posts.Any(), dtoBlog.Posts.FirstOrDefault(), null) == null), null, new PostDto() {})})

Это очень поможет в диагностике / понимании более сложных выражений запросов.

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