public ActionResult Index(AttendeeFilterViewModel model) { if (ModelState.IsValid) { //get selected session Class Ids var selectedFilter = model.AttendeeSessionFilter.Where(a => a.IsSelected) .Select(a => new { SessionTopicID = a.SessionTopicID, TimeSlots = a.TimeSlots.Where(b => b.IsSelected) } ).ToList(); //create filters ids //where each row is topic id with times slots in that topic List <Tuple <int, List <int> > > filterIds = new List <Tuple <int, List <int> > >(); foreach (var item in selectedFilter) { var tuple = new Tuple <int, List <int> >(item.SessionTopicID, item.TimeSlots.Select(a => a.SessionClassID).ToList()); filterIds.Add(tuple); } //get attendeeSession data that match the criteria var attendeeSessions = _SessionAttendeeService. GetAllFilterByTopicAndTime(filterIds.ToArray(), model.AndingSession, model.AndingTime).ToList(); //var attendeeSessions = _SessionAttendeeService.GetAll(); //search the attend that meet the criteria var attendees = _SessionAttendeeService.GetAllToPivotTable(attendeeSessions.Select(a => a.Id)); var result = Mapper.Map <DataTable, SessionAttendeeViewModel>(attendees); //add mandatory fields result.DataHeader.Add("Session"); result.DataHeader.Add("StartDate"); result.DataHeader.Add("EndDate"); result.DataHeader[0] = "Attendee ID"; foreach (var item in result.DataValue) { var attendeeSession = attendeeSessions.SingleOrDefault(a => a.Id == int.Parse(item.First())); if (attendeeSession == null) { continue; } item.Add(attendeeSession.SessionClass.SessionTopic.Name); item.Add(attendeeSession.SessionClass.StartDate.ToString("dd/MM/yyyy h:mm tt")); item.Add(attendeeSession.SessionClass.EndDate.ToString("dd/MM/yyyy h:mm tt")); //replace the db id with Attendee id item[0] = attendeeSession.AttendeeID.ToString(); } model.SessionAttendeeResultViewModel = result; } return(View(model)); }