我有一个.Net Core 2 webapi,我在其中使用automapper映射到Dtos。一切正常,除了我在将对象映射到Dto时看到意外行为,并且Dto还包含集合的映射。 E.g
CreateMap<Order, OrderDto>();
CreateMap<Product, ProductDto>();
类在哪里
public partial class Order
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products{ get; set; }
public int ProductCount {return Products.Count;}
}
public partial class Product
{
public int Id { get; set; }
public int OrderId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
以下按预期方式工作;
该类已映射,并且Dto
中的ProjectCount是正确的public partial class OrderDto
{
public int Id { get; set; }
public virtual ICollection<Product> Products{ get; set; }
public int ProductCount{ get; set; }
}
_context.Orders.Include<>(Products).ProjectTo<>(OrderDto)
但执行以下操作后,productcount始终为零。
E.g。如果我这样做;
public partial class OrderDto
{
public int Id { get; set; }
public virtual ICollection<ProductDto> Products{ get; set; }
public int ProductCount{ get; set; }
}
public partial class ProductDto
{
public int Id { get; set; }
public int OrderId { get; set; }
public string Name { get; set; }
}
_context.Orders.Include<>(Products).ProjectTo<>(OrderDto)
为什么会发生这种情况,我怎样才能确保它不会发生?这是一个真实世界的例子,我需要一个引用该集合的属性 - 我需要它在base和Dto中。我可以做以下工作正常,但它似乎不应该是它的工作方式...
public partial class OrderDto
{
public int Id { get; set; }
public virtual ICollection<ProductDto> Products{ get; set; }
public int ProductCount {return Products.Count;}
}
public partial class ProductDto
{
public int Id { get; set; }
public string Name { get; set; }
}
_context.Orders.Include<>(Products).ProjectTo<>(OrderDto)
答案 0 :(得分:0)
我分析了SQL,发现Automapper改变了查询的形成方式。如果没有嵌套投影,则会进行两次查询; [查询比这更复杂并使用连接,但你明白了]
Select Id from orders
Select Id,Name from products where productid in [select id from orders ]
使用嵌套投影,为每个嵌套的Dto
执行Select Id from orders
Select Id,Name from products where id=1
Select Id,Name from products where id=2