Определите профиль автоматического отображения, когда существует несколько уровней иерархии

#c# #automapper

Вопрос:

Привет, у меня есть такой JSON

 {
   "assessments":[
      {

         "deliveryTeamName":"Reporting Team",
         "programIncrementId":"125",
         "programIncrementName":"1",
         "sprintId":"558",
         "sprintName":"1",
         "isDeleted":false,
         "created":"2018-04-24T08:39:19",
         "createdBy":"Vijaykumar",
         "objectives":[
            {
               "objectiveId":"118",
               "objectiveTitle":"Position level data (Stretch)"
            },
            {
               "objectiveId":"261",
               "objectiveTitle":"Configure for Internal users"
            }
         ],
         "answers":[
            {
               "questionId":"35",
               "questionTitle":"Question 2"
            },
            {
               "questionId":"36",
               "questionTitle":"Question 2a"
            }
         ]
      }
   ]
}
 

А вот класс, который я создал для десериализации.

 public class listOfSelfAssessments
{
    public class selfAssessments
    {
        public List<assessments> assessments { get; set; }

    }
    public class assessments
    {
        public string deliveryTeamName { get; set; }
        public string programIncrementId { get; set; }
        public string programIncrementName { get; set; }
        public string sprintId { get; set; }
        public string sprintName { get; set; }

        public string created { get; set; }
        public string createdBy { get; set; }
        public List<objectives> objectives { get; set; }
        public List<answers> answers { get; set; }

    }

    public class objectives
    {
        public string objectiveId { get; set; }
        public string objectiveTitle { get; set; }

    }
    public class answers
    {
        public string questionId { get; set; }
        public string questionTitle { get; set; }
    }
}
 

Все работает нормально до десериализации

 response.EnsureSuccessStatusCode();
string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var format = "dd/MM/yyyy"; // your datetime format
var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = format };
listOfSelfAssessments.selfAssessments results = new listOfSelfAssessments.selfAssessments();
results = JsonConvert.DeserializeObject<listOfSelfAssessments.selfAssessments>(responseBody);
 

Но проблема возникает здесь, когда моя итоговая таблица, в которую я хочу записать эти данные, выглядит так

 team_name       Type        pi_id      pi_name     sprint_id      Sprint_Name   Type_Id    Title
-----------------------------------------------------------------------------------------
Reporting Team  Objective    125         1             558          1             118       Position Level Data
Reporting Team  Objective    125         1             558          1             261       Configure for internal users
Reporting Team  Question    125         1             558          1             35       Question 2
Reporting Team  Question    125         1             558          1             36       Question 2a
--------------------------------------------------------------------------------------------------
 

Вот класс модели таблиц

 public partial class BmtSelfassessmentResponse
{

    public string Type { get; set; }
    public int QuestionId { get; set; }
    public string Team { get; set; }
    public string Pi { get; set; }
    public string Sprint { get; set; }
    public DateTime? Created { get; set; }
    public string CreatedBy { get; set; }
    public string TypeId { get; set; }
    public string Title { get; set; }
    
}
 

Я понятия не имею, как создать профиль автоматического отображения для этого json и класса модели таблицы

Пожалуйста, поделитесь идеей. Или полагаться на автомат в этой такой сложной иерархии-не очень хороший способ?

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

1. Автомат можно было согнуть, чтобы выровнять данные, хотя он и не был предназначен для этого. Но, возможно, лучше сделать это вручную, с небольшой помощью LINQ.

2. Опубликуйте также класс модели таблицы

3. @Dialecticus Было бы здорово, если бы вы поделились некоторыми подсказками о том, как справиться с этим с помощью linq или любых функций со стрелками

4. @AkshayGaonkar Обновил вопрос

5. Попробуйте поискать в гугле «автоматический переход от одного ко многим».

Ответ №1:

Большое спасибо @Dialecticus за способ linq, с помощью которого я смог реализовать его без особых усилий. Просто опубликуйте это для кого-то, кто получил аналогичное требование

 var objectives = (from a in results.assessments
                  from o in a.objectives
                  select new BmtSelfassessmentResponse { Art = a.agileReleaseTrainName, Team = a.deliveryTeamName, Active = true, ResponseV = (int.TryParse(o.completePercentage, out int p) ? (Convert.ToDecimal(o.completePercentage) / 100) : null), Type = "Objective" });
var answers = (from a in results.assessments
               from q in a.answers
               select new BmtSelfassessmentResponse { Art = a.agileReleaseTrainName, Team = a.deliveryTeamName, Active = true, ResponseT = q.answer,Type="Question" });
    
List<BmtSelfassessmentResponse> SA = objectives.Concat(answers).ToList<BmtSelfassessmentResponse>();