簡體   English   中英

AutoMapper map 從嵌套集合到另一個集合,其中元素需要來自源的值

[英]AutoMapper map from nested collection to a different collection where elements need value from source

給定以下類和一些示例數據,有沒有辦法獲取 Foo 的實例並創建一個 Bar 集合來獲取 Foo.Id?

public class CreditsAndDebits
{
    public decimal Credits { get; set; }
    public decimal Debits { get; set; }
}

public class Foo
{
    public int Id { get; set; }
    public Dictionary<int, CreditsAndDebits> CreditsAndDebitsByYear { get; set; }
}

public class Bar
{
    public int FooId { get; set; }
    public int Year { get; set; }
    public decimal Increase { get; set; }
    public decimal Decrease { get; set; }
}

示例數據:

    var dGrohl = new Foo
    {
        Id = 13,
        CreditsAndDebitsByYear = new Dictionary<int, CreditsAndDebits>() {
        { 2019, new CreditsAndDebits { Credits = 100, Debits = 40 } } ,
        { 2020, new CreditsAndDebits { Credits = 80, Debits = 20 } } }
    };

使用以下配置,我可以將 CreditsAndDebitsByYear 字典 map 轉換為“Bars”集合,但我想讓 Bar.FooId 填充來自 dGrohl 的 Id 值,並且我一生都無法弄清楚該怎么做。 .

    var config = new AutoMapper.MapperConfiguration(cfg =>
    {
        cfg.CreateMap<KeyValuePair<int, CreditsAndDebits>, Bar>()
            .ForMember(dest => dest.Year, opt => opt.MapFrom(src => src.Key))
            .ForMember(dest => dest.Increase, opt => opt.MapFrom(src => src.Value.Credits))
            .ForMember(dest => dest.Decrease, opt => opt.MapFrom(src => src.Value.Debits));
    });

    var mapper = new AutoMapper.Mapper(config);

    var bars = mapper.Map<IEnumerable<KeyValuePair<int, CreditsAndDebits>>, IEnumerable<Bar>>(dGrohl.CreditsAndDebitsByYear);

在此處輸入圖像描述

根據@LucianBargaoanu 的評論,我可以通過執行以下操作來使其工作:

// Not necessary but for consistency
public const string FOO_ID_KEY = "FOO_ID_KEY";

    var dGrohl = new Foo
    {
        Id = 13,
        CreditsAndDebitsByYear = new Dictionary<int, CreditsAndDebits>() {
        { 2019, new CreditsAndDebits { Credits = 100, Debits = 40 } } ,
        { 2020, new CreditsAndDebits { Credits = 80, Debits = 20 } } }
    };

    var config = new AutoMapper.MapperConfiguration(cfg =>
    {
        cfg.CreateMap<KeyValuePair<int, CreditsAndDebits>, Bar>()
            // Added following line:
            .ForMember(dest => dest.FooId, opt => opt.MapFrom((src, dest, destMember, context) => context.Items[FOO_ID_KEY]))
            .ForMember(dest => dest.Year, opt => opt.MapFrom(src => src.Key))
            .ForMember(dest => dest.Increase, opt => opt.MapFrom(src => src.Value.Credits))
            .ForMember(dest => dest.Decrease, opt => opt.MapFrom(src => src.Value.Debits));
    });

    var mapper = new AutoMapper.Mapper(config);

    // added the opt=>opt.Items part below
    var bars = mapper.Map<IEnumerable<KeyValuePair<int, CreditsAndDebits>>, IEnumerable<Bar>>(dGrohl.CreditsAndDebitsByYear, opt=>opt.Items[FOO_ID_KEY] = dGrohl.Id);

暫無
暫無

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

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