c# - 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
,但还没有解决。
任何人都可以帮忙吗?如何将对象的单个实例映射到简化实体的集合?
解决方案
正如我在评论中已经说过的,一些 LINQ 在这里会有很大帮助。但在这里。您可以将相同的想法应用于您的版本。您拥有的大多数MapFrom
s 都是无用的。
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
.
推荐阅读
- html - 如何在vue中使组件高度相同
- java - 如何关联两个不相关的类,以便它们可以在抽象类中用于相同的方法
- reactjs - 如何解决问题 Module not found: Can't resolve 'firebase/storage' in next.js (已经完成 yarn add firebase)
- json - 如何将具有嵌套结构的 Gatling jsonFeeder 转换为 json 请求正文?
- lua - 插入表 LUA 的不同方法
- javascript - How to write a switch statement for radio buttons
- javascript - For 循环中断一个不相关的数组
- pine-script - Pine Script V4 - Marketcap 标签的 Resolve_error "Fund"
- json - 是否可以在模式定义中引用 JSON 数据本身?
- sql - SQL WHERE 列值转换成大写字母