public List <WorkerDTO> GetWorkersList(WorkerListFilterDTO filter) { var dtos = new List <WorkerDTO>(); try { var exprList = new List <Expression <Func <Worker, bool> > >(); if (!string.IsNullOrEmpty(filter.Status)) { exprList.Add(wo => wo.Status.ToLower() == filter.Status.ToLower()); } if (filter.Ids != null && filter.Ids.Exists(id => !string.IsNullOrEmpty(id))) { //Equalizes Ids to Uppercase to search in database filter.Ids = filter.Ids.Where(id => !string.IsNullOrEmpty(id)).Select(id => id.ToLower()).ToList(); exprList.Add(wo => filter.Ids.Contains(wo.Id.ToLower())); } if (filter.Logins != null && filter.Logins.Exists(lo => !string.IsNullOrEmpty(lo))) { //Equalizes logins in Uppercase to search in database filter.Logins = filter.Logins.Where(lo => !string.IsNullOrEmpty(lo)).Select(lo => lo.ToLower()).ToList(); exprList.Add(wo => filter.Logins.Contains(wo.Login.ToLower())); } if (exprList.Count <= default(int)) { throw new ServiceException(CommonExceptionType.ParameterException, "Logins, Ids or Status"); } var loadOptions = new List <string>(); if (filter.LoadManager) { loadOptions.Add("Manager"); loadOptions.Add("Manager.Manager"); } if (filter.LoadEmployees) { loadOptions.Add("Employees"); loadOptions.Add("Employees.Employee"); } if (filter.LoadBudgetCode) { loadOptions.Add("BudgetCode"); loadOptions.Add("BudgetCode.Area"); loadOptions.Add("BudgetCode.Site"); loadOptions.Add("BudgetCode.Dept"); loadOptions.Add("BudgetCode.Lbc"); } //Get workers using query options var workers = _workerRepo.SelectWhere(exprList.BuildExpression(), loadOptions.ToArray()).ToList(); //Validates all basic worker properties var validations = new List <ValidationResult>(); workers.AsParallel().ForAll(co => { co.Validate(); validations.AddRange(co.Validation.Results); }); if (validations.Any()) { throw new ServiceException(validations); } dtos = workers.Map <List <Worker>, List <WorkerDTO> >(); //Maps manager and employees data workers.AsParallel().ForAll(wo => { var dto = dtos.FirstOrDefault(d => d.Id.ToUpper() == wo.Id.ToUpper()); dto.SourceDatabase = CommonDatabase.DBALCAP.ToString(); if (wo.Employees != null && wo.Employees.Count > 0) { var employees = wo.Employees.Select(e => e.Employee).ToList(); dto.Employees = employees.Map <List <Worker>, List <WorkerLeafDTO> >(); } //Maps managers and third partners data if (filter.LoadManager || filter.LoadThirdPartners) { var adUser = _adRepo.GetUser(dto.Login, filter.LoadManager, filter.LoadThirdPartners); //Map manager data if (wo.Manager != null && wo.Manager.FirstOrDefault() != null) { var manager = wo.Manager.FirstOrDefault().Manager; dto.Manager = manager.Map <Worker, WorkerLeafDTO>(); } else if (adUser.ActiveDirectoryManager.Login != null) { var manager = _workerRepo.Get(w => w.Login.ToUpper() == adUser.ActiveDirectoryManager.Login.ToUpper()); dto.Manager = manager.Map <Worker, WorkerLeafDTO>(); } if (filter.LoadThirdPartners) { var logins = adUser.ActiveDirectoryThirdPartners.Select(ad => ad.Login.ToUpper()).Distinct().ToList(); var thirdPartners = _workerRepo.SelectWhere(w => logins.Contains(w.Login.ToUpper())).ToList(); dto.ThirdPartners = thirdPartners.Map <List <Worker>, List <ThirdPartnerDTO> >(); } } }); } catch (Exception ex) { LogHelper.ExceptionAndThrow(ex); } return(dtos); }
public List <WorkerDTO> GetWorkersList(WorkerListFilterDTO filter) { var dtos = new List <WorkerDTO>(); try { var exprList = new List <Expression <Func <Worker, bool> > >(); if (!string.IsNullOrEmpty(filter.Status)) { exprList.Add(wo => wo.Status.ToUpper() == filter.Status.ToUpper()); } if (filter.Ids != null && filter.Ids.Exists(id => !string.IsNullOrEmpty(id))) { //Equalizes Ids to Uppercase to search in database filter.Ids = filter.Ids.Where(id => !string.IsNullOrEmpty(id)).Select(id => id.ToUpper()).ToList(); exprList.Add(wo => filter.Ids.Contains(wo.Id.ToUpper())); } if (filter.Logins != null && filter.Logins.Exists(lo => !string.IsNullOrEmpty(lo))) { //Equalizes logins in Uppercase to search in database filter.Logins = filter.Logins.Where(lo => !string.IsNullOrEmpty(lo)).Select(lo => lo.ToUpper()).ToList(); exprList.Add(wo => filter.Logins.Contains(wo.Login.ToUpper())); } if (exprList.Count <= default(int)) { throw new ServiceException(CommonExceptionType.ParameterException, "Logins, Ids or Status"); } if (string.IsNullOrEmpty(filter.SpecificDatabase.ToString())) { throw new ServiceException(CommonExceptionType.ParameterException, "Specific Database"); } InitializeUnitOfWork(filter.SpecificDatabase); //Gets workers, maps to dto type var workersDtos = _workerRepo.SelectWhere(exprList.BuildExpression()).ToList().Map <List <Worker>, List <WorkerDTO> >(); var lbcIds = workersDtos.Select(wd => wd.LbcId); var lbcs = _lbcRepo.SelectWhere(lr => lbcIds.Contains(lr.LbcId)).ToList().Map <List <Lbc>, List <Alcoa.Framework.Contract.DTOs.Corporate.LbcDTO> >(); var deptIds = workersDtos.Select(wd => wd.DeptId); var depts = _deptRepo.SelectWhere(dr => deptIds.Contains(dr.DeptId)).ToList().Map <List <Dept>, List <Alcoa.Framework.Contract.DTOs.Corporate.DeptDTO> >(); foreach (var worker in workersDtos) { //Set database source in returned object worker.SourceDatabase = filter.SpecificDatabase.ToString(); //If budget code load option is true if (filter.LoadBudgetCode) { worker.BudgetCode = new Alcoa.Framework.Contract.DTOs.Corporate.BudgetCodeDTO { Lbc = lbcs.FirstOrDefault(l => l.LbcId == worker.LbcId), Dept = depts.FirstOrDefault(d => d.DeptId == worker.DeptId), }; } } dtos.AddRange(workersDtos); } catch (Exception ex) { LogHelper.ExceptionAndThrow(ex); } return(dtos); }