自动映射投影导致嵌套Dto

时间:2017-09-17 12:35:16

标签: automapper asp.net-core-2.0

我有一个.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)

1 个答案:

答案 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