![](/img/trans.png)
[英]How to map IEnumerable<CustomClass> property grouped by Id property using Automapper
[英]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.