private IEnumerable <Course> GetUnlockedCourses(int studentId) { var completedCourses = studentCourseAssociationService.FindBy(x => x.StudentId == studentId).Select(x => x.Course).ToList(); var studentProgram = studentService.Get(studentId).Program; var studentAllowedCourses = programCourseAssociationService.FindBy(x => x.ProgramId == studentProgram.Id).Select(x => x.Course).ToList(); var studentNewAllowedCourses = studentAllowedCourses.Where(x => !completedCourses.Select(y => y.Id).ToList().Contains(x.Id)); List <Course> unlockedCourses = new List <Course>(); foreach (var course in studentNewAllowedCourses) { var prerequisites = prerequisiteService.FindBy(x => x.CourseId == course.Id).ToList(); if (prerequisites == null || prerequisites.Count() == 0) { unlockedCourses.Add(course); } else { int prerequisiteCount = prerequisites.Count(); int counter = 0; foreach (var prerequisite in prerequisites) { if (completedCourses.Select(x => x.Id).ToList().Contains(prerequisite.CoursePrerequisiteId.Value)) { counter++; } } if (counter == prerequisiteCount) { unlockedCourses.Add(course); } } } return(unlockedCourses); }