gpt4 book ai didi

c# - 如何展平自动映射器列表中的条件对象

转载 作者:太空狗 更新时间:2023-10-29 19:47:57 24 4
gpt4 key购买 nike

我有一个 Item,其中包含 Product 的列表,这些列表使用 AutoMapper< 映射到各自的 ViewModel 对象/strong>.

在我的 MVC 项目中,我有一个 Action 方法,它显示一个带有选定 ProductItem。为此,我有一个名为 ItemDetailsViewModelViewModel,它包含扁平化的 Item 对象、ProductViewModel 的列表和一个扁平化的选定 Product

我遇到的困难是如何最好地显示这个扁平化的选定 Product

把它想象成 eBay,您有一个 Item,您可以选择多种变体,例如按颜色。对我来说,多个变体是 Products。当用户选择 Product 时,我想返回 ItemDetailsItemProducts 列表和选择产品

我想知道这样做的最佳方法是什么?目前我的方法是将 Item 映射到 ItemDetailsViewModel,选择所需的 ProductViewModel,然后专门映射 ProductViewModel 的每个属性 回到 ItemDetailsViewModel。此外,由于 ItemProduct 具有相同的命名属性,映射产品的最后一行会覆盖 Item 的 ID 和代码。

关于如何最好地配置映射有什么建议吗?

我省略了现有的映射,因为除了将选定的 ProductViewModel 映射回 ItemDetailsViewModel 之外,它主要是直接的一对一映射.

Mapper.CreateMap<Item, ItemViewModel>()
.ReverseMap();

Mapper.CreateMap<ProductViewModel, ItemDetailsViewModel>()
.ForMember(d => d.ProductId, o => o.MapFrom(s => s.Id))
.ForMember(d => d.ProductCode, o => o.MapFrom(s => s.Code));

public class Item
{
public int Id { get; set; }
public string Code { get; set; }
public IList<Product> Products { get; set; }
}

public class Product
{
public int Id { get; set; }
public string Code { get; set; }
}

public class ItemViewModel
{
public int Id { get; set; }
public string Code { get; set; }

public IList<ProductViewModel> Products { get; set; }
}

public class ItemDetailsViewModel : ItemViewModel
{
public int ProductId;
public string ProductCode;
}

public class ProductViewModel
{
public int Id { get; set; }
public string Code { get; set; }
}

Action

public ActionResult ItemDetails()
{
var item = new Item
{
Id = 1,
Code = "Item1",
Products = new List<Product>()
{
new Product { Id = 1, Code = "Product1" },
new Product { Id = 2, Code = "Product2" },
new Product { Id = 3, Code = "Product3" },
}
};

var productCode = "Product2";
var itemDetailsViewModel = Mapper.Map<ItemDetailsViewModel>(item);

if (itemDetailsViewModel.Products != null && itemDetailsViewModel.Products.Count > 0)
{
ProductViewModel productViewModel = null;
if (!String.IsNullOrEmpty(productCode))
productViewModel = itemViewModel.Products.FirstOrDefault(e => e.Code.Equals(productCode, StringComparison.OrdinalIgnoreCase));

if (productViewModel == null)
productViewModel = itemViewModel.Products[0];

Mapper.Map<ProductViewModel, ItemDetailsViewModel>(productViewModel, itemDetailsViewModel);
}
}

最佳答案

一种解决方案是在从 ProductViewModelItemDetailsViewModel 的映射中忽略 ItemDetailsViewModel 中的属性:

Mapper.CreateMap<ProductViewModel, ItemDetailsViewModel>()
.ForMember(d => d.Id, opt => opt.Ignore())
.ForMember(d => d.Code, opt => opt.Ignore())
.ForMember(d => d.ProductId, o => o.MapFrom(s => s.Id))
.ForMember(d => d.ProductCode, o => o.MapFrom(s => s.Code));

关于c# - 如何展平自动映射器列表中的条件对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21087176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com