2017-07-03 159 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); 
}