public async Task <ActionResult> ModeratorCourseSubscribers(int?id) { // I. Checks. // Get Id for the selected course. if (!int.TryParse(id.ToString(), out int intId)) { return(RedirectToAction("Index")); } // Get CourseDTO object. CourseDTO courseDTO = await CourseService.GetAsync(intId); if (courseDTO == null) { return(RedirectToAction("Index")); } // II. Set ViewBag properties. ViewBag.CourseName = courseDTO.CourseTitle; ViewBag.CourseId = intId; // III. AutoMapper Setup. var config = new MapperConfiguration(cfg => { cfg.CreateMap <TestResultDTO, TestResultViewModel>() .ForMember("Id", opt => opt.MapFrom(tr => tr.TestResultId)) .ForMember("TestTitle", opt => opt.MapFrom(tr => tr.TestResultDetails.FirstOrDefault().Question.Topic.Course.CourseTitle)) .ForMember("UserEmail", opt => opt.MapFrom(tr => tr.UserProfile.Email)); cfg.CreateMap <TestResultDetailDTO, TestResultDetailViewModel>() .ForMember("Question", opt => opt.MapFrom(trd => trd.Question.QuestionText)) .ForMember("Topic", opt => opt.MapFrom(trd => trd.Question.Topic.TopicTitle)); }); IMapper iMapper = config.CreateMapper(); // IV. Get data for a view. IEnumerable <SubscriptionDTO> courseSubscriptions = SubscriptionService.Find(dto => dto.CourseId == intId && dto.IsApproved); //IEnumerable<TestResultDTO> source = TestResultService.Find(tr => !tr.IsTopicTest) IEnumerable <TestResultDTO> source = TestResultService.GetAll() .Where(tr => tr.TestResultDetails.FirstOrDefault().Question.Topic.CourseId == intId) .Join(courseSubscriptions, tr => tr.UserProfileId, cs => cs.UserProfileId, (tr, cs) => tr).Distinct(); //.ToList(); IEnumerable <TestResultViewModel> courseTestResults = iMapper.Map <IEnumerable <TestResultDTO>, IEnumerable <TestResultViewModel> >(source); IEnumerable <SubscriberTestResultViewModel> resultView = courseTestResults.GroupBy(ctr => ctr.UserEmail) .Select(ctr => new SubscriberTestResultViewModel { UserEmail = ctr.Key, AttemptsNumber = ctr.Count(item => !item.IsTopicTest), BestResult = ctr.Max((item) => { if (!item.IsTopicTest) { return(item.Result * 1000 / item.MaxScore); } return(0); }), IsPassedTest = ctr.Max((item) => { if (!item.IsTopicTest) { return(item.IsPassedTest); } return(false); }) }); // V. return(View(resultView)); }