AutoMapper选择表达式翻译

时间:2018-06-04 14:10:13

标签: c# automapper

我试图准确理解AutoMapper将为以下映射生成什么选择表达式。我试图复制一个只在使用AutoMapper投影时出现的错误,但不包含手工制作的选择表达式。我知道映射表达式是多余的,可能会简化,但随后bug也会消失。

我相信映射应该逐字地生成一个select表达式,但是我知道它没有,因为通过替换该表达式而不是使用AutoMapper进行投影,一切都按预期工作(并且bug消失了)。

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 :(得分:0)

根据@LucianBargaoanu的建议,为了获得AutoMapper在使用let redBubble = 0; let x = false; let y = 0; let d = 0; function setup() { createCanvas(400, 400); redBubble = new Bubble(300, 100, 10); } function draw() { background(56, 23, 56); redBubble.show(); redBubble.toRight(); redBubble.toLeft(); redBubble.example(); }; class Bubble { constructor(x, y, d) { this.x = x; this.y = y; this.d = d; } show() { fill(255); ellipse(this.x, this.y, this.d * 2); } toRight() { if (this.x < 350) { this.x = this.x + 1; } else if (this.x === 350) { this.y = this.y - 1; } } toLeft() { if (this.y <= 30) { x = true; } else if (this.y === 30) { x = false; } } example() { if (x) { this.x--; // not working print("hit this.y = 30"); // working } } } 时生成的精确select表达式,您只需要调用ProjectTo<>()即可。表达式中有一个context.Entities.ProjectTo<Dto>().Expression.ToString()语句,我刚刚将其转换为三元表达式。

对于发布的映射,IIF的输出如下。

ToString()

这将极大地帮助诊断/理解更复杂的查询表达式。