簡體   English   中英

如何在自動映射器中將條件對象變平

[英]How to flatten a conditional object in a list in automapper

我有一個Item ,其中包含使用AutoMapper映射到其各自的ViewModel對象的Product的列表。

在我的MVC項目中,我有一個Action方法,該方法顯示帶有選定ProductItem 為此,我有一個名為ItemDetailsViewModelViewModel ,其中包含展平的Item對象, ProductViewModel的列表和展平的選定Product

我遇到的困難最好是展示這個扁平化的選定Product

可以像在eBay上一樣擁有Item並且可以選擇多種變體,例如按顏色。 對我來說,多個變體是Products 當用戶選擇Product我要返回ItemDetailsItemProducts列表和所選Product

我想知道這樣做的最好方法嗎? 目前,我的方法是將Item映射到ItemDetailsViewModel ,選擇所需的ProductViewModel ,然后專門將ProductViewModel每個屬性映射回ItemDetailsViewModel 另外,由於ItemProduct具有相同的命名屬性,因此映射該產品的最后一行將覆蓋Item的id和代碼。

關於如何最佳配置映射的任何建議?

ItemDetailsViewModel去了ItemDetailsViewModel映射,因為除了將所選的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; }
}

行動

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM