2017-09-17 56 views
0

我有一個.Net Core 2 webapi,其中我使用automapper映射到Dtos。一切工作正常,除了我看到一個意外的行爲時,我將一個對象映射到Dto,並且Dto還包含集合的映射。 E.gAutomapper投影導致嵌套Dto的空集合

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; } 
} 

下按預期工作;

類的映射,以及ProjectCount是正確的DTO

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) 

爲什麼會發生這種情況,我該如何確保它不會發生?這是一個真實世界的例子,我需要一個引用集合的屬性 - 我在基礎和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

我異形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 
執行