public ListSuitableTraineeDTO GetSuitableTrainees(int programID)
        {
            try
            {
                ListSuitableTraineeDTO suitableTrainees = new ListSuitableTraineeDTO();

                List <ShortTraineeDetailDTO> listSuitableTrainees = new List <ShortTraineeDetailDTO>();

                #region Get Competencies trained by the program, we will use it to compare with trainee's Competencies

                List <int> competenciesTrainedID = new List <int>();

                //Get program by ProgramId
                var program = _programRepository.Get(programID);

                int[] modulesIncludedID = program.ArrayOfIncludedModules;

                //Get list module by array ModuleId
                var modulesIncluded = _moduleRepository.GetModulesByArrayID(modulesIncludedID);

                foreach (Module module in modulesIncluded)
                {
                    //Get list Competencies trained by module
                    List <int> competenciesTrainedIDByModule = module.ArrayOfTrainingCompetencies.ToList();

                    //Add there Competencies to list Competencies trained by program
                    foreach (int competenceID in competenciesTrainedIDByModule)
                    {
                        competenciesTrainedID.Add(competenceID);
                    }
                }

                //Remove the duplicate Competencies
                competenciesTrainedID = competenciesTrainedID.Distinct().ToList();

                #endregion

                #region Get all the trainee in database, we will findout the suitable trainees

                var trainees = _traineeRepository.GetAllIncluding(trainee => trainee.Person);

                foreach (Trainee trainee in trainees)
                {
                    int[] competenciesGained = trainee.ArrayOfCompetence;

                    if (_compareAppService.IsMissingCompetencies(competenciesGained, competenciesTrainedID.ToArray()))
                    {
                        //This one is a suitable trainee
                        ShortTraineeDetailDTO suitableTrainee = new ShortTraineeDetailDTO();

                        suitableTrainee.TraineeId         = trainee.Id;
                        suitableTrainee.Name              = trainee.Person.Name;
                        suitableTrainee.DefaultDepartment = trainee.DefaultDepartment;

                        listSuitableTrainees.Add(suitableTrainee);
                    }
                }

                suitableTrainees.ListSuitableTrainees = listSuitableTrainees;

                #endregion

                return(suitableTrainees);
            }
            catch (Exception e)
            {
                return(null);
            }
        }