如何使用AutoMapper映射集合对象 替换foreach循环设置OwnerData的逻辑
使用AutoMapper替换foreach实现Car集合OwnerData批量赋值
步骤1:配置AutoMapper映射规则
自定义映射Profile类,配置同类型映射规则,支持外部传入Owner实例为Car的OwnerData属性赋值:
using AutoMapper; public class CarProfile : Profile { public CarProfile() { // 配置Owner到Owner的映射,忽略不需要赋值的Id字段 CreateMap<Owner, Owner>() .ForMember(dest => dest.Id, opt => opt.Ignore()); // 配置Car到Car的映射,保留原Car的Id、Name属性不覆盖 CreateMap<Car, Car>() .ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.Name, opt => opt.Ignore()) // 从映射参数中获取外部传入的Owner实例,赋值给OwnerData .ForMember(dest => dest.OwnerData, opt => opt.MapFrom((src, dest, destMember, context) => { var owner = (Owner)context.Items["OwnerInfo"]; return context.Mapper.Map<Owner>(owner); })); } }
步骤2:初始化AutoMapper
ASP.NET Core 依赖注入环境
在Program.cs中注册AutoMapper服务:
builder.Services.AddAutoMapper(typeof(CarProfile));
之后在业务类中通过构造函数注入IMapper接口即可使用。
非依赖注入环境
手动构造Mapper实例:
var config = new MapperConfiguration(cfg => cfg.AddProfile<CarProfile>()); var mapper = config.CreateMapper();
步骤3:替换原有foreach逻辑
直接调用AutoMapper的集合映射方法,传入查询到的cars集合和ownerData参数,自动完成批量赋值:
Owner ownerData = repository.Get<Owner>(id); IEnumerable<Car> cars = repository.Get<Car>(); // 批量映射替换整段foreach逻辑 var data = _mapper.Map<IEnumerable<Car>>(cars, opt => { opt.Items["OwnerInfo"] = ownerData; });
如果你不需要自动适配Owner新增字段,也可以直接在映射规则里硬编码赋值三个字段,效果和原foreach完全一致:
CreateMap<Car, Car>() .ForMember(dest => dest.Id, opt => opt.Ignore()) .ForMember(dest => dest.Name, opt => opt.Ignore()) .ForMember(dest => dest.OwnerData, opt => opt.MapFrom((src, dest, destMember, context) => { var owner = (Owner)context.Items["OwnerInfo"]; return new Owner { CarName = owner.CarName, Name = owner.Name, Phone = owner.Phone }; }));
内容的提问来源于stack exchange,提问作者user1765862
相关产品推荐
相关产品推荐

