Automapper将多个对象映射到一个对象

7

我有两个子类,需要将一个List元素从它们复制到主对象中。

public Class Foo1 : Anote
{
  public bool Ison { get; set;}
  public List<Anote>Anotes { get; private set;}

  public Foo1()
  {
    this.Anotes = new List<Anote>();
  }
}

public Class Foo2 : Bnote
{
  public bool Ison { get; set;}
  public List<Bnote>Anotes { get; private set;}

  public Foo2()
  {
    this.Anotes = new List<Bnote>();
  }
}

public Class Foo3 : Cnote
{
   public bool Ison { get; set;}
   public List<Cnote>Anotes { get; private set;}
   public List<Cnote>Bnotes { get; private set; }

}

我将从数据库中检索数据并将其放入Foo1和Foo2中。然后,我需要将Foo1和Foo2中的List数据映射到Foo3中的List元素。

我已经完成了以上步骤。

Foo1A foo1a = new Foo1A();
Foo2A foo2a = new Foo2A();

Mapper.CreateMap<Foo1, Foo1A>();
Mapper.CreateMap<Foo2, Foo2A>();
Mapper.Map<Foo1, Foo2A>(foo1, foo1a);
Mapper.Map<Foo2, Foo2A>(foo2, foo2a);

这个可以实现,但我需要做的是

将Foo1中的List Anotes映射到Foo3中的List Anotes 将Foo2中的List Anotes映射到Foo3中的List Bnotes。


重复的问题 => https://dev59.com/cGEi5IYBdhLWcg3wRayf - Mohammad Khodabandeh
2个回答

12

你只需要做:

Mapper.CreateMap<ANote, CNote>();

Mapper.CreateMap<Foo1, Foo3>()
    .ForMember(dest => dest.ANotes, opt => opt.MapFrom(src => src.ANotes))
    .ForMember(dest => dest.BNotes, opt => opt.Ignore());

Mapper.CreateMap<Foo2, Foo3>()
    .ForMember(dest => dest.BNotes, opt => opt.MapFrom(src => src.ANotes))
    .ForMember(dest => dest.ANotes, opt => opt.Ignore());

Foo3 foo3 = new Foo3();

Mapper.Map<Foo1, Foo3>(foo, foo3);
Mapper.Map<Foo2, Foo3>(foo2, foo3);

foo3.ANotesfoo3.BNotes都应该已经被正确映射。


对于其他遇到这个问题的人,我一直在尝试使用这个解决方案来合并两个对象列表。但是我无法弄清楚如何使其工作。我不得不使用foreach循环,然后映射每个项目并手动将其添加到列表中。 - Icestorm0141
@Icestorm0141:你有新的问题吗? - Andrew Whitaker
在第二个映射中,将Foo2映射到Foo3,即.ForMember(dest => dest.BNotes, opt => opt.MapFrom(src => src.ANotes)),这里应该是src.BNotes而不是src.ANotes,对吗? - Janis S.
我对这个解决方案的问题在于你正在复制Foo1和Foo2的映射。如果你有复杂的映射,那么重复这么多次就是一种代码异味。我希望Automapper有一种方法来做到这一点:Mapper.CreateMap<Src1, Src2, Dest3>();像OP一样,Src1和Src2在结构上几乎相同。 - goku_da_master
在这个例子中,您将列表写入了两个不同的列表,如果您想要将它们全部写入到Foo3中的同一个列表中,该怎么做呢?链接 - Linda Lawton - DaImTo

0

我觉得被接受的答案对我的情况并不是一个可接受的解决方案。昨晚我正在入睡时突然有这个想法:

假设你想将两个类 Foo1Foo2 映射到 Foo3

public Class Foo1 : Anote
{
  public bool Ison { get; set;}
  public List<Anote>Anotes { get; private set;}

  public Foo1()
  {
    this.Anotes = new List<Anote>();
  }
}

+

public Class Foo2 : Bnote
{
  public bool Ison { get; set;}
  public List<Bnote>Anotes { get; private set;}

  public Foo2()
  {
    this.Anotes = new List<Bnote>();
  }
}

=

public Class Foo3 : Cnote
{
   public bool Ison { get; set;}
   public List<Cnote>Anotes { get; private set;}
   public List<Cnote>Bnotes { get; private set; }

}

你所需要的就是为 Automapper 目的创建另一个包装类。
public class Foo1And2 {
    public Foo1 Foo1 {get;set;}
    public Foo2 Foo2 {get;set;}
}

然后定义映射:

CreateMap<Foo1And2, Foo3>().ConvertUsing(x => ConvertFoo1And2ToFoo3(x));

public Foo3 ConvertFoo1And2ToFoo3(Foo1And2 foo1And2)
{
    return new Foo3
    {
        Ison = foo1And2.Foo1.Ison && foo1And2.Foo2.Ison,
        Anotes = foo1And2.Foo1.Anotes,
        Bnotes = foo1And2.Foo2.Bnotes,
    };
}

并使用它

var foo3 = Map<Foo3>(new Foo1And2
{
    Foo1 = foo1,
    Foo2 = foo2,
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接