【问题标题】:Complex Object to List Mapping in automapper - RESTAPI自动映射器中的复杂对象到列表映射 - RESTAPI
【发布时间】:2020-05-12 20:22:10
【问题描述】:

下面是我的源对象

public class Source
{

    public string Name { get; set; }
    public DateTime GeneratedFrom { get; set; }
    public DateTime GeneratedTo { get; set; }

}

然后是目标对象

public class Destination
{
    public DateTime Day{ get; set; }
    public string Name { get; set; } 
}

目标中的日期从Source.GenerateFromSource.GenerateTo 获取其值(迭代直到Source.Generatefrom <= Source.GenerateTo使用while 循环)。最后,我需要一个如下的对象列表。

{"Day":"2019-02-04","name":"abc"},
{"Day":"2019-02-05","name":"abc"},
{"Day":"2019-02-06","name":"abc"}

这可以使用 automapper 实现吗?

下面是带有 whileloop 的映射器配置文件类。不确定这是否是正确的方法

CreateMap<Source, Destination>()
.forMember(
 dest => dest.Day,
 opt => opt.MapFrom(src => src.GenerateFrom))
 .AfterMap((src, dest) =>
 {
     var StartDate = src.GenerateFrom;
     var EndDate = src.GenerateTo;

     List<Destination> list = new List<Destination>();
     while(Startdate <= EndDate)
     {
        var data = new Destination {Day = StartDate, name = src.Name};
        list.Add(data);
        StartDate.AddDays(1);
     }
 });

【问题讨论】:

  • 向我们展示你的 while 循环
  • @RomanMarusyk 使用映射器配置文件更新了帖子

标签: c# automapper


【解决方案1】:

如果Day 总是从GeneratedFrom 属性中获取它的值,您可以为您的对象注册此映射。 (或根据您的需要进行修改)

CreateMap<Source, Destination>()
                    .ForMember(d => d.GeneratedFrom, o => o.MapFrom(s => s.Day))
                    .ForMember(d => d.Name, o => o.MapFrom(s => s.Name));

那么如果你想得到Source.Generatefrom &lt;= Source.GenerateTo所在的对象列表你需要使用System.Linq表达式:

var destList = sourceList.Where(x => x.GeneratedFrom <= x.GeneratedTo)
                         .Select(_mapper.Map<Destination>).ToList();

然后使用Newtonsoft.Json库对其进行序列化:

var json = JsonConvert.SerializeObject(destList);

【讨论】:

  • 你可以直接在IEnumerable上调用Map,不需要SelectToList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多