private void match(String facultyName, List <Preference> preferences, Student student) { //add student as rejected in the db at first FacultyRankList rejected = new FacultyRankList() { EGN = student.EGN, ProgrammeName = CONST_REJECTED + ' ' + facultyName, TotalGrade = 0 }; context.FacultyRankLists.Add(rejected); context.SaveChanges(); try { foreach (Preference preference in preferences) { int quota = queryManager.getQuota(preference.ProgrammeName, (bool)student.Gender); List <FacultyRankList> rankList = queryManager.getRankListData(preference.ProgrammeName, (bool)student.Gender); double minimalGrade = 0; double studentCount = rankList.Count; if (rankList.Count != 0) { minimalGrade = rankList.Min(list => list.TotalGrade); } if (preference.TotalGrade > minimalGrade && studentCount >= quota && ((quota >= 2 && rankList[quota - 2].TotalGrade > minimalGrade) || (quota == 1 && rankList[quota - 1].TotalGrade > minimalGrade) )) { var entries = rankList.Where(entry => entry.TotalGrade == minimalGrade); foreach (FacultyRankList entry in entries) { context.FacultyRankLists.Attach(entry); context.FacultyRankLists.Remove(entry); } context.SaveChanges(); } if ((preference.TotalGrade > 0 && preference.TotalGrade >= minimalGrade) || (preference.TotalGrade < minimalGrade && studentCount < quota)) { FacultyRankList entry = new FacultyRankList() { EGN = preference.EGN, ProgrammeName = preference.ProgrammeName, TotalGrade = preference.TotalGrade }; context.FacultyRankLists.Add(entry); context.FacultyRankLists.Attach(rejected); context.FacultyRankLists.Remove(rejected); context.SaveChanges(); break; } } } catch (Exception e) { context.FacultyRankLists.Attach(rejected); context.FacultyRankLists.Remove(rejected); context.SaveChanges(); throw e; } }