如何在Automapper中使用比较表达式将2个对象列表合并为1个

时间:2019-05-28 08:04:50

标签: c# .net-core automapper

我需要使用Automapper的比较表达式将2个对象列表合并为1个对象,以获取列表1中对象的一些属性和列表2中对象的一些属性

我尝试使用Automapper.Collection(https://github.com/AutoMapper/AutoMapper.Collection)nuget,但是默认操作是:

  • 如果ID的匹配项将映射1到2
  • 如果存在2个,但没有添加1个
  • 如果1个存在且2个没有从集合中删除

但是我只想在有匹配项的情况下进行映射,否则,我想忽略记录

public class Class1
        {
            public string Id { get; set; }
            public string Code { get; set; }
        }

        public class Class2
        {
            public string Id { get; set; }
            public string Description { get; set; }
        }

        public class Class3
        {
            public string NewId { get; set; }
            public string NewCode { get; set; }
            public string NewDescription { get; set; }
        }

var configuration = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<Class1, Class3>()
                    .ForMember(dest => dest.NewId, opt => opt.MapFrom(src => src.Id))
                    .ForMember(dest => dest.NewCode, opt => opt.MapFrom(src => src.Code))
                    ;
                cfg.CreateMap<Class2, Class3>()
                    .ForMember(dest => dest.NewDescription, opt => opt.MapFrom(src => src.Description))
                    ;
            });
            var mapper = configuration.CreateMapper();

            var class1List = new List<Class1>
            {
                new Class1 {Id = "1", Code = "code1"},
                new Class1 { Id = "2", Code = "code2" },
                new Class1 {Id = "3", Code = "code3"}
            };

            var class2List = new List<Class2>
            {
                new Class2 {Id = "2", Description = "desc2"}
            };

 var class3List = mapper.Map<List<Class3>>(class1List);
            mapper.Map(class2List, class3List);

我希望最后的“ class3List”包含3个元素,标识为“ 2”的元素必须同时具有代码和描述。

1 个答案:

答案 0 :(得分:1)

Automapper可能不是该任务的正确工具。 您可以使用简单的LINQ Join语句代替Automapper:

var class3List = class1List.Join(class2List, o => o.Id, i => i.Id, (o, i) => new Class3 { NewId = o.Id, NewCode = o.Code, NewDescription = i.Description }).ToList();