Заполнить вложенный список классов из одной таблицы данных c # - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть 2 класса с одинаковой структурой таблиц в БД.

public class Student
{
   public int SId {get; set;}
   public string SName {get; set;}
   public List<StudentDetail> SDetail {get; set;}
}

public class StudentDetail
{
   public int StudentDetailId {get; set;}
   public int StudentId {get; set;}
   public int ExamId {get; set;}
   public string Department {get; set;}
   public string Address{get; set;}
}

. Данные извлекаются из SQL путем объединения обеих таблиц с использованием StudentId.Каждый StudentId может иметь несколько данных о ученике.Теперь я хочу заполнить данные в вышеупомянутых 2 классах.Я написал следующий код.Поскольку у одного идентификатора есть несколько деталей, поэтому я использовал group by.

    var list = dataTable.AsEnumerable()
                   .Select(x => new Student
                   {
                       SId = x.Field<int>("SId"),
                       SName = x.Field<string>("SName"),
                       SDetail = new List<StudentDetail>
                       {
                            new StudentDetail
                            {
                                StudentDetailId = x.Field<int> 
                                ("StudentDetailId"),
                                ExamId = x.Field<int>("ExamId"),
                                Department = x.Field<string>("Department") 
                            }
                       }.ToList()
                   }).GroupBy(x => x.SId).Select(x => 
                      x.FirstOrDefault()).ToList();

Но, например, для Id 1, если есть 2 детали, тогда в списке деталей ученика должно быть 2 записи.Но этот код создает две записи Id, имеющие одну запись в Student Detail, каждую из которых, как показано ниже

        Id -> 1 -> SId -> 1
        Id -> 1 -> SId -> 2

Данные должны быть созданы, как показано ниже:

        Id -> 1 -> SId -> 1
                -> SId -> 2

Любая помощь?

1 Ответ

0 голосов
/ 27 декабря 2018

Метод Select создает один new Student для каждой записи.Для поля SDetail вы создаете список, содержащий ровно один StudentDetail.Когда вы затем группируете по полю SId, каждый Student все еще содержит только один StudentDetail.

. Решение состоит в том, чтобы сначала выполнить группировку.Затем вы можете думать о каждой группе, представляющей один Student, и об элементах каждой группы, представляющих StudentDetail:

var list = dataTable.AsEnumerable()
                    .GroupBy(rec => rec.Field<int>("SId"))
                    .Select(gr => new Student
                    {
                        SId = gr.Key,
                        SName = gr.First().Field<string>("SName"),
                        SDetail = gr.Select(detail => new StudentDetail
                        {
                            StudentDetailId = detail.Field<int>("StudentDetailId"),    
                            ExamId = detail.Field<int>("ExamId"),
                            Department = detail.Field<string>("Department")
                        }).ToList()
                     }).ToList();

Существует еще одна перегрузка метода GroupBy, которая объединяет GroupBy иSelect:

var list = dataTable.AsEnumerable()
                    .GroupBy(rec => rec.Field<int>("SId"),
                             (key, gr) => new Student
                             {
                                 SId = key,
                                 SName = gr.First().Field<string>("SName"),
                                 SDetail = gr.Select(detail => new StudentDetail
                                 {
                                     StudentDetailId = detail.Field<int>("StudentDetailId"),
                                     ExamId = detail.Field<int>("ExamId"),
                                     Department = detail.Field<string>("Department")
                                 }).ToList()
                              }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...