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

#c#

#c#

Вопрос:

Я новичок в Linq и c #. Я работаю над заполнением двух вложенных списков с использованием двух таблиц данных.Есть 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();
  

Я рассчитываю заполнить список участников.
Большое спасибо

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

1. Как поместить предложение where? кроме того, возникает ошибка CS1061 ‘Grade’ не содержит определения для ‘ToList’ и не может быть найден доступный метод расширения ‘ToList’, принимающий первый аргумент типа ‘Grade’ (вам не хватает директивы using или ссылки на сборку?)

Ответ №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 объект еще не полностью сконструирован.