【问题标题】:Select Max() with GroupBy, using linq method syntax, EF选择 Max() 和 GroupBy,使用 linq 方法语法,EF
【发布时间】:2017-07-03 10:22:06
【问题描述】:

我有一堆带有一些数据的类:

public class Teacher
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime bDate { get; set; }
    //One-to-one with course

    public int CourseId { get; set; }
    public virtual Course Course { get; set; }
}


public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection <Student_Course> Student_Courses { get; set; }
    public int TeacherId { get; set; }
    public virtual Teacher Teacher { get; set; }
}


public class Grade
{
    public int Id { get; set; }
    public int Mark { get; set; }
    //one-to-many with Student_Course

    public int Student_CourseId { get; set; }
    public Student_Course Student_Course { get; set; }
}

public class Student_Course
{
    public int Id { get; set; }
    //many-to-many with student
    public int StudentId { get; set; }
    public virtual Student Student { get; set; }

    //many-to-many with course
    public int CourseId { get; set; }
    public virtual Course Course { get; set; }
}

 public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime bDate { get; set; }
    //one-to-many with student_course
    public virtual ICollection <Student_Course> Student_Courses { get; set; }

}

现在我尝试编写一个查询 - 对于每个人来说,老师(姓名)需要按学生分数输出他最好的学生(姓名),最好的分数来自班级成绩,我的代码:

public IActionResult Task9()
    {
        var task9 = Db.Grades.GroupBy(gr => gr.Student_Course.Course.Teacher.Name).Select(x => new Task9
        {
            NameOfSt = x.Select(st => st.Student_Course.Student.Name).FirstOrDefault(),//Needs to correct this line
            NameOfTeac = x.Select(r => r.Student_Course.Course.Teacher.Name).FirstOrDefault(),
            BestMark = x.Max(gr => gr.Mark)


            //NameOfSt = Db.Students.FirstOrDefault(st => st.Id ==x.FirstOrDefault().Student_Course.StudentId).Name
        });
        return View(task9);
    }

这样代码才能输出正确的教师姓名和学生在课程中的最佳成绩。但学生的名字实际上是错误的。我该如何解决?感谢您的帮助。

茶 最佳标志 名字学霸

【问题讨论】:

    标签: asp.net entity-framework linq lambda delegates


    【解决方案1】:

    您可以在选择学生姓名之前按 Mark 使用 OrderByDescending:

    var task9 = Db.Grades.GroupBy(gr => gr.Student_Course.Course.Teacher.Name).Select(x => new Task9
        {
            NameOfSt = x.OrderByDescending(st => st.Mark).Select(st => st.Student_Course.Student.Name).FirstOrDefault(),//Needs to correct this line
            NameOfTeac = x.Select(r => r.Student_Course.Course.Teacher.Name).FirstOrDefault(),
            BestMark = x.Max(gr => gr.Mark)        
        });
    

    【讨论】:

      【解决方案2】:

      GroupBy 中,您需要使用分组的值(在本例中为x)来选择Grade 具有最高Grade 的对象。在下面的代码中,我通过按降序排列 Mark 得到 bestGrade 对象,然后获取第一个条目,然后从该对象中获取学生、姓名和最佳分数:

      public IActionResult Task9()
      {
          var task9 = Db.Grades.GroupBy(gr => gr.Student_Course.Course.Teacher.Name).Select(x =>
          {
              var bestGrade = x.OrderByDescending(y => y.Mark).First();
              return new Task9
              {
                  NameOfSt = bestGrade.Student_Course.Student.Name,//Needs to correct this line
                  NameOfTeac = bestGrade.Student_Course.Course.Teacher.Name,
                  BestMark = bestGrade.Mark
              };
          });
      
          return View(task9);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-01
        • 1970-01-01
        • 2011-03-11
        • 2020-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多