public List <ReportModel> RenderMonthlyReport(List <ReportModel> monthlyReports, List <Student> students, List <Subject> subjects, int year, int month, int numOfSubject) { Semester semester = new Semester(); Result result = new Result(); // calculate average for each student foreach (var student in students) { ReportModel monthlyReport = new ReportModel(); monthlyReport.student = new Student(student); double?average = null; // get semesterId by month switch (month) { case 9: case 10: case 11: case 12: semester = _semesterService.GetSemesters(1, year).FirstOrDefault(); break; case 2: case 3: case 4: case 5: semester = _semesterService.GetSemesters(2, year).FirstOrDefault(); break; default: break; } // calculate each subject average foreach (var subject in subjects) { // get result, filter detail by month result = _resultService.GetResult(student.StudentID, subject.SubjectID, semester.SemesterID, month); if (result == null) { average = null; } else { // get monthly average if (result.ResultDetails.Count() == 0) { average = null; } else { average = result.ResultDetails.ToList()[0].MonthlyAverage; } } ResultAverage resultAverage = new ResultAverage() { subject = new Subject(subject), average = average }; monthlyReport.resultAvgs.Add(resultAverage); } monthlyReport.sumAverage = _resultService.CalculateStudentAverage(monthlyReport.resultAvgs, numOfSubject); monthlyReports.Add(monthlyReport); } // sort by sumAverage monthlyReports = monthlyReports.OrderByDescending(m => m.sumAverage).ToList(); // ranking monthlyReports = _reportService.StudentsRanking(monthlyReports); // performance monthlyReports = _reportService.EvaluatePerformance(monthlyReports); return(monthlyReports); }