2017-07-03 157 views
0

我有一些数据一堆类:选择MAX()用的GroupBy,使用LINQ方法的语法,EF

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); 
    } 

使代码输出正确的老师的名字和对学生的过程中最好的成绩。但是学生的名字其实是错误的。我该如何解决这个问题?谢谢你的帮助。

蒂雅克 BestMark NameStud

回答

1

你可以使用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)   
    }); 
+0

谢谢,此代码完美工作。 – Eldar

1

GroupBy你需要使用分组的值(在这种情况下x)选择具有最高GradeGrade对象。在下面的代码,我在降序排列由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); 
}