我试图准确理解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将生成什么(或如何)。
答案 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()
这将极大地帮助诊断/理解更复杂的查询表达式。