Плоская схема автоматического преобразования Dotnet в сложную иерархию

#c# #.net #.net-core #automapper

#c# #.net #.net-ядро #автоматический преобразователь

Вопрос:

У меня есть таблица базы данных, которая имеет очень плоскую структуру. Ну, я хочу создать результирующий запрос в более структурированном и иерархическом формате, как только он будет возвращен объекту в dotnet. Для этого я создал несколько классов моделей, которые представляют, как я хочу организовать возвращаемые данные. Пример

Плоский объект

 Public class FlatObject {
   public string key1 {get; set;}
   public string key2 {get; set;}
   public string key3 {get; set;}
   public string key4 {get; set;}
}
  

Результирующий объект

 public class ResultObject {
   public Category1 category1 {get;set;}
   public Category2 category2 {get;set;}
   public Category3 category3 {get;set;}
}
  

Пример категории

 public class Category1 {
   public SubCategory1 sCategory1 {get;set;}
}
  

Подкатегория

 public class SubCategory1 {
   public string key1 {get;set;}
}
  

Вы заметите, что в этой иерархии есть какой-то глубокий объект, и я пытаюсь сопоставить ключи от объекта falt с этими глубоко вложенными объектами. Я пробовал AutoMapper, но у меня проблемы с отображением такой глубины объекта. Есть идеи о том, как я могу этого добиться?

Комментарии:

1.Повторный поиск docs.automapper.org/en/latest/Flattening.html и docs.automapper.org/en/latest/….

2. После этого у меня возникает ощущение, что я собираюсь сопоставить отдельные свойства с их более глубоким соответствием в целевом объекте. Это проще, когда у вас есть объект глубиной всего в 1 подобъект, но у меня есть от 2 до трех подобъектов для обхода. Это кажется неэффективным.

Ответ №1:

Чтобы сгладить объект, сначала создайте отображение в обратном направлении, то есть сглаживание. Затем добавьте ReverseMap() , и все готово:

 CreateMap<ResultObject, FlatObject>()
    .ForMember(
        d => d.key1,
        o => o.MapFrom(s => s.category1.sCategory1.key1))
    .ForMember(
        d => d.key2,
        o => o.MapFrom(s => s.category2.sCategory2.key2))
    .ForMember(
        d => d.key3,
        o => o.MapFrom(s => s.category3.sCategory3.key3))
    .ForMember(
        d => d.key4,
        o => o.MapFrom(s => s.category4.sCategory4.key4))
    .ReverseMap();