首页 > 解决方案 > AutoMapper:在传递属性时将单个对象映射到 IEnumerable/子集合

问题描述

我有以下两个ShopifySharp对象。

public class Product
{            
    public string Title { get; set; }

    public string BodyHtml { get; set; }

    public IEnumerable<ProductVariant> Variants { get; set; }
}


public class ProductVariant 
{
    public string Title { get; set; }

    public string Barcode { get; set; }

}

然后我有以下模型

public class ShopifyVariant 
{
    public long Id { get; set; }

    public long ProductId { get; set; }

    public string ProductName { get; set; }

    public string VariantName { get; set; }

    public string Price { get; set; }
}

我想映射 to 的一个实例,ShopifySharp.Product因为IEnumerable<ShopifyVariant>每个实例ShopifySharp.Product总是至少有一个ProductVariant.

通常这将是一个微不足道的问题,因为您可以简单地在两个对象之间创建一个映射,如下所示:

this.CreateMap<ShopifySharp.ProductVariant, ShopifyVariant>()

但我需要获取只能从ShopifySharp.Product对象中获取的每个变体的 ProductName 和 ProductId。

我最初的想法是尝试这样的事情

this.CreateMap<ShopifySharp.ProductVariant, ShopifyVariant>()
.ForMember(o => o.Id, o => o.MapFrom(f => f.Id))
.ForMember(o => o.ProductId, o => o.MapFrom((src, dest, m, c) => c.Items["ProductId"]))
.ForMember(o => o.ProductName, o => o.MapFrom((src, dest, m, c) => c.Items["ProductName"]))
.ForMember(o => o.VariantName, o => o.MapFrom(f => f.Title));

this.CreateMap<ShopifySharp.Product, IEnumerable<ShopifyVariant>>()

但我不清楚如何实际创建从 Product 到 IEnumerable 的投影。

我目前正在使用自定义ITypeConverter,但还没有解决。

任何人都可以帮忙吗?如何将对象的单个实例映射到简化实体的集合?

标签: c#automappershopifyautomapping

解决方案


正如我在评论中已经说过的,一些 LINQ 在这里会有很大帮助。但在这里。您可以将相同的想法应用于您的版本。您拥有的大多数MapFroms 都是无用的。

c.CreateMap<ProductVariant, ShopifyVariant>()
    .ForMember(o => o.ProductId, o => o.MapFrom((src, dest, m, context) => context.Items["ProductId"]))
    .ForMember(o => o.ProductName, o => o.MapFrom((src, dest, m, context) => context.Items["ProductName"]))
    .ForMember(o => o.VariantName, o => o.MapFrom(f => f.Title));
c.CreateMap<Product, IEnumerable<ShopifyVariant>>().ConvertUsing((product,variant,context)=>
{
    context.Items["ProductId"] = product.Id;
    context.Items["ProductName"] = product.Name;
    return context.Mapper.Map<List<ShopifyVariant>>(product.Variants);
});

new []{new Product{Id=1,Variants=new[]{new ProductVariant{Id=1},new ProductVariant{Id=2}}}, new Product{Id=2,Variants=new[]{new ProductVariant{Id=3},new ProductVariant{Id=4}}}}
.SelectMany(product=>mapper.Map<List<ShopifyVariant>>(product,_=>{}));

IEnumerable调用Map.


推荐阅读