Сделать маппинг иерархии на плоскую Dto

180
18 апреля 2022, 18:50

Допустим, у меня есть класс в который вложена коллекция объектов другого класса.

Наружу я хочу отправлять плоскую модель.

Скажем было так:

var class1=new Class1("Бла Бла Бла", new List<Class2>(){new Class2("Бла2"),new Class2("Бла3")})

А в итоге хочу получить вот такой результат:

var dtoClassList=new List<DtoClass>(){new DtoClass("Бла Бла Бла","Бла2"),new DtoClass("Бла Бла Бла","Бла3")}

Можно ли как-нибудь добиться такого через AutoMapper?

Пока пришел к такому способу:

Делаю настройку отображения class1 на dtoClassList Делаю настройку отображения class2 на dtoClassList

Далее через SelectMany создаю плоскую коллекцию из class1. Далее в цикле foreach создаю DtoClass и вызываю на этот объект

_mapper.Map(class1, dtoClass );
_mapper.Map(Class2, dtoClass );

и добавляю в результирующую коллекцию.

Может быть можно проще?

Answer 1

Возможно вам подойдет использование кастомного TypeConverter:

public record Class1(string name, List<Class2> list);
public record Class2(string name);
public record Dto(string class1Name, string class2Name);
public class FlatConverter : ITypeConverter<Class1, List<Dto>>
{
    public List<Dto> Convert(Class1 source, List<Dto> destination, ResolutionContext context)
        => source.list
            .Select(class2 => new Dto(source.name, class2.name))
            .ToList();
}
// ...
cfg.CreateMap<Class1, List<Dto>>().ConvertUsing<FlatConverter>();
// данные из вашего примера
var class1 = new Class1(
    "Бла Бла Бла",
    new List<Class2>()
    {
        new Class2("Бла2"),
        new Class2("Бла3")
    });
var dto = mapper.Map<List<Dto>>(class1);

dto будет содержать список классов, где одно поле взято из родительского класса, второе из дочернего.

READ ALSO
Как сохранить простой словарь в Unity?

Как сохранить простой словарь в Unity?

Как сохранить простой словарь Dictionary <int, string> в Unity?

175
Выбор точки появления в Unity3d

Выбор точки появления в Unity3d

Пытаюсь сделать переключение места появления(transform) в одном моём проектеВыглядеть это должно так: в главном меню игры игрок выбирает точку...

156
В чем разница между возвращением из API-контроллера IActionResult и конкретного объекта?

В чем разница между возвращением из API-контроллера IActionResult и конкретного объекта?

Собственно, в чем разница и что лучше использовать повсеместно и в каких случаях?

170
Как сделать синхронизацию?

Как сделать синхронизацию?

Доброго времени сутокСуть такая, есть клиенты (приложения Windows) и нужно сделать на них синхронизацию данных

272