Collections 自动映射:展平嵌套集合

Collections 自动映射:展平嵌套集合,collections,automapper,flatten,Collections,Automapper,Flatten,我在将一个具有集合的DTO映射到实体模型中的展开版本时遇到问题 以下是DTO类: public class Location { public int LocationId {get; set;} public string LocationName {get;set;} public List<HoursOfOperation> HoursOfOperation {get; set;} } public class HoursOfOperation {

我在将一个具有集合的DTO映射到实体模型中的展开版本时遇到问题

以下是DTO类:

public class Location {
   public int LocationId {get; set;}
   public string LocationName {get;set;}
   public List<HoursOfOperation> HoursOfOperation {get; set;}
}

public class HoursOfOperation {
      public int WeekNumber {get; set;}
      public int DayNumber {get; set;}
      public List<TimeSlot> OperatingHours {get; set;}
}

public class TimeSlot{
      public TimeSpan StartTime {get; set;}
      public TimeSpan EndTime { get; set;}
}
我使用Automapper并取得了以下成就:

public OpHoursMappingProfile()
    {
        CreateMap<HoursOfOperation, Models.ClientDb.HoursOfOperation>()
            .ForMember(dest => Enum.GetName(typeof(DayOfWeek), dest.DayNumber), opt => opt.MapFrom(t => t.DayNumber))
            .ForMember(dest => dest.WeekNumber, opt => opt.MapFrom(t => t.WeekNumber));
    }
公共映射配置文件()
{
CreateMap()
.FormMember(dest=>Enum.GetName(typeof(DayOfWeek),dest.DayNumber),opt=>opt.MapFrom(t=>t.DayNumber))
.ForMember(dest=>dest.WeekNumber,opt=>opt.MapFrom(t=>t.WeekNumber));
}

我不知道如何绘制时间段。我尝试创建一个自定义扩展,但没有任何帮助。

您的评论让我更好地了解了您想要实现的目标,而且在我看来,它正在将单个源对象映射到目标对象的集合。为此,我建议创建自定义类型转换器:

公共类HoursOfOperationConverter:ITypeConverter
{
公共IEnumerable转换(
工作小时数来源,
IEnumerable目的地,
决议(上下文)
{
foreach(source.OperatingHours中的var时隙)
{
var hours=context.Mapper.Map(源);
小时=context.Mapper.Map(时隙,小时);
收益返回小时数;
}
}
}
注意转换器如何在每次迭代中映射到
HoursOfOperation
两次。第一次从最初的工作时间DTO开始,因此可以填充常规属性,如
FkLocationId
。当前时隙的第二次时间,因此可以从相应的时隙填充
StartTime
EndTime
日期。理解为什么第二次使用到现有对象的映射也很重要。这是因为否则第一次映射的结果将丢失

映射配置文件:

公共类映射配置文件:配置文件
{
CreateMap()
福门博先生(
destination=>destination.HoursOfOperationId,
options=>options.MapFrom(source=>source.Id))
福门博先生(
destination=>destination.FkLocationId,
options=>options.MapFrom(source=>source.LocationId));
CreateMap();
CreateMap()
.ConvertUsing();
}
我不完全理解您的周/日编号映射,因此我将它们留给您来实现

用法示例:

var result=mapper.Map(小时);

结束时间使用
Max()
,对
开始时间使用
Min()
。例如,要获取结束时间:
.ForMember(dst=>dst.EndTime,opt=>opt.MapFrom(t=>t.OperatingHours.Max(hours=>hours.EndTime))
@Prolog:实际上,我想要的是为每个时隙创建一个HoursOfOperation实体。因此,如果DTO在给定的一天中有3个时隙,则将在数据库中创建3小时的操作记录。
public OpHoursMappingProfile()
    {
        CreateMap<HoursOfOperation, Models.ClientDb.HoursOfOperation>()
            .ForMember(dest => Enum.GetName(typeof(DayOfWeek), dest.DayNumber), opt => opt.MapFrom(t => t.DayNumber))
            .ForMember(dest => dest.WeekNumber, opt => opt.MapFrom(t => t.WeekNumber));
    }