Как заполнить вложенный (родительский/дочерний) список с помощью двух таблиц данных с использованием LINQ

Я новичок в Linq и С#. Я работаю над заполнением двух вложенных списков с использованием двух таблиц данных. Существует StudentList - это родительский список. У каждого студента есть GradeList для каждого курса. Я могу получить два набора данных в виде таблиц данных из базы данных, один - студент, другой - класс. В классе Grade есть идентификатор студента, который может быть связан со студентом. Как я могу заполнить StudentList?

    public class Student
{
    public string ID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public List<Grade> GradeList { get; set; }

}
  public class Grade
{
    public string CourseID { get; set; }
    public string CourseTitle { get; set; }
    public decimal CourseGrade { get; set; }
    public string studentID { get; set; }
}

//ниже код

DataTable dt = ds.Tables[0];  //students
        DataTable dt1 = ds.Tables[1]; //Grades

        studList = (from DataRow dr in dt.Rows
                        select new Student()
                        {
                            ID = dr["ID"].ToString(),
                            FirstName = dr["FIRSTNAME"].ToString(),
                            LastName = dr["LASTNAME"].ToString(),
                            GradeList = (from DataRow gdr in dt1.Rows as IEnumerable
                                       //  where gdr["studentID"] == ID
                                         select new Grade() 
                                         {

                                             CourseID = gdr["COURSEID"].ToString(),
                                             CourseTitle = gdr["COURSETITLE"].ToString(),
                                             CourseGrade = Convert.ToDecimal(gdr["COURSEGRADE"]),
                                             studentID = gdr["STUDENTID"].ToString()
                                         }.ToList()

                                         )


                        }).ToList();

Я ожидаю заполнить studList. Большое спасибо

Как поставить предложение where? также существует ошибка CS1061 «Оценка» не содержит определения для «ToList», и не может быть найден доступный метод расширения «ToList», принимающий первый аргумент типа «Оценка» (вам не хватает директивы использования или ссылки на сборку ?)

Jenny 09.04.2019 18:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
323
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

studList = 
    (from DataRow dr in dt.Rows
     select new Student()
     {
         ID = dr["ID"].ToString(),
         FirstName = dr["FIRSTNAME"].ToString(),
         LastName = dr["LASTNAME"].ToString(),
         Email = dr["EMAIL"].ToString(),
         GradeList = 
             (from DataRow gdr in dt1.Rows as IEnumerable
              where gdr["studentID"] == dr["ID"]
              select new Grade() 
              {
                  CourseID = gdr["COURSEID"].ToString(),
                  CourseTitle = gdr["COURSETITLE"].ToString(),
                  CourseGrade = Convert.ToDecimal(gdr["COURSEGRADE"]),
                  studentID = gdr["STUDENTID"].ToString()
              }).ToList()
      }).ToList();

Первый ToList() должен быть после закрывающей скобки, а условие where для GradeList должно ссылаться на переменную вне инициализатора объекта, потому что объект Student еще не полностью сконструирован.

Другие вопросы по теме