自动映射器,将父元素列表映射到子列表中

时间:2016-06-15 12:24:30

标签: c# mapping automapper

我正在努力使用AutoMapper来映射这些对象。 这是我的DTO:

public class ContainerDTO
    {
        public List<MoneyAccountDTO> MoneyAccounts { get; set; }

        public List<CardDTO> Cards { get; set; }
    }

public class MoneyAccountDTO
    {
        public string Iban { get; set; }
    }

public class CardDTO
    {
        public string MoneyAccountIban { get; set; }
    }

以下是BusinessObject:

public class Container
    {
        public List<MoneyAccount> MoneyAccounts { get; set; }
    }

public class MoneyAccount
    {
        public string Iban { get; set; }

        public List<Card> Cards { get; set; }
    }

public class Card
    {
        public string MoneyAccountIban { get; set; }
    }

我在这里尝试实现的是找到ContainerDTO中与MoneyAccount具有相同Iban的所有CardDTO,并在MoneyAccount中创建这些卡的列表。

这里的问题是我收到与其相关的MoneyAccountDTO级别相同的CardsDTO对象。

我从那样开始:

cfg.CreateMap<ContainerDTO, Container>()
                   .ForMember(dest => dest.MoneyAccounts, opt => opt.MapFrom(src => src.Cards.
                                                                             Where(c => c.MoneyAccountIban == XXX)));

但是我无法用映射器枚举的Money帐户替换那些XXX。它认为我没有朝着正确的方向发展。

我无法为此映射找到一个好的解决方案。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

此问题的解决方案是使用带有where子句的foreach。

cfg.CreateMap<ContainerDTO, Container>().AfterMap((src, dest) => dest.MoneyAccounts
                                                              .ForEach(a => a.Cards = src.Cards
                                                                       .Where(c => c.MoneyAccountIban == a.Iban)
                                                                                         .Select(d => Mapper.Map<CardDTO, ICard>(d)).ToList()));

它就像一个魅力!