Как объединить 2 списка объектов в 1 с выражением сравнения в Automapper - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно объединить 2 списка объектов в 1, взяв некоторые свойства из объектов в списке 1 и некоторые свойства из объектов в списке 2, используя выражение сравнения с использованием Automapper

Я пробовал Automapper.Collection (https://github.com/AutoMapper/AutoMapper.Collection) nuget, но действия по умолчанию:

  • Если совпадение идентификатора будет отображаться с 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 Ответ

1 голос
/ 28 мая 2019

Automapper может не подходить для этой задачи. Вместо Automapper вы можете использовать простое выражение LINQ Join:

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();
...