繁体   English   中英

如何 map IEnumerable<model> 到带有 IEnumerable 的 DTO<anotherdto> 使用自动映射器的属性?</anotherdto></model>

[英]How to map IEnumerable<Model> to a DTO with IEnumerable<AnotherDto> property using automapper?

我有这些 model 和 DTO

public class ServiceModel
{
    public string ServiceId { get; set; }
    public string ServiceName { get; set; }
    
    public string ServiceTypeId { get; set; }
    public double QuarterlyCharge { get; set; }
    public double AnnualCharge { get; set; }
}

public class ServiceResponseDto
{
    public string ServiceId { get; set; }
    public string ServiceName { get; set; }
    public IEnumerable<TaxDto> Tax { get; set; }
}

public class TaxDto
{
    public string ServiceTypeId { get; set; }
    public double QuarterlyCharge { get; set; }
    public double AnnualCharge { get; set; }
}

我有 ServiceModel 的 IEnumerable 导致:

服务标识 服务名称 服务类型 ID 年费 季刊
1 服务 1 1 1
1 服务 2 2 2
1 服务 3 3 3

我如何将 map 变成 ServiceResponseDto

这是我目前的解决方案

IEnumerable<IGrouping<string, ServiceModel>> groupedservice = serviceQueryResult.GroupBy(c => c.ServiceId);
ServiceResponseDto mappedService = _mapper.Map<IEnumerable<IGrouping<string, ServiceModel>>, ServiceResponseDto >(groupedservice );

我的映射:

CreateMap<IEnumerable<IGrouping<string, ServiceModel>>, ServiceResponseDto>()
    .ForMember(dest => dest.ServiceId, opt => opt.MapFrom(src => src.FirstOrDefault().Key))
    .ForMember(dest => dest.ServiceName, opt => opt.MapFrom(src => src.FirstOrDefault().FirstOrDefault().ServiceName))
    .ForMember(dest => dest.Tax , opt => opt.MapFrom(src => src.Select(c => new TaxDto() { ServiceTypeId  = c.FirstOrDefault().ServiceTypeId , QuarterlyCharge = c.FirstOrDefault().QuarterlyCharge, AnnualCharge  = c.FirstOrDefault().AnnualCharge } )));

预期结果:

new ServiceResponseDto()
{
    ServiceId  = "1",
    ServiceName = "Service"
    Tax = new IEnumerable<TaxDto>()
    {
        new = TaxDto(){ServiceTypeId=ServiceType1, QuarterlyCharge =1, AnnualCharge=1},
        new = TaxDto(){ServiceTypeId=ServiceType2, QuarterlyCharge =2, AnnualCharge=2},
        new = TaxDto(){ServiceTypeId=ServiceType3, QuarterlyCharge =3, AnnualCharge=3},
    }
}

实际结果:映射后仅显示 1 条记录

new ServiceResponseDto()
{
    ServiceId  = "1",
    ServiceName = "Service"
    Tax = new IEnumerable<TaxDto>()
    {
        new = TaxDto(){ServiceTypeId=ServiceType1, QuarterlyCharge =1, AnnualCharge=1}
    }
}

所以基本上你创建了一个从IEnumerable<IGrouping<string, ServiceModel>>到单个ServiceModel的映射。 但是您似乎想为IGrouping<string, ServiceModel>创建一个 map 到一个ServiceModel

因此,将您的映射更改为:

CreateMap<IGrouping<string, ServiceModel>, ServiceResponseDto>()
  .ForMember(dest => dest.ServiceId, opt => opt.MapFrom(src => src.Key))
  .ForMember(dest => dest.ServiceName, opt => opt.MapFrom(src => src.FirstOrDefault().ServiceName))
  .ForMember(dest => dest.Tax, opt => opt.MapFrom(src => src.Select(c => new TaxDto() { ServiceTypeId = c.ServiceTypeId, QuarterlyCharge = c.QuarterlyCharge, AnnualCharge = c.AnnualCharge })));

然后在代码调用中:

var mappedServices = mapper.Map<IEnumerable<IGrouping<string, ServiceModel>>, IEnumerable<ServiceResponseDto>>(groupedServices);

请记住,由于您从IEnumerable<IGrouping<string, ServiceModel>>开始,您最终会得到IEnumerable<ServiceResponseDto>

在此处查看实际操作: https://dotnetfiddle.net/YzIlDt

希望这对您的项目有所帮助并祝您好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM