Оптимизация и рефакторинг основного кода ASP .NET EF для повышения производительности WebAPI ⇐ C#
Оптимизация и рефакторинг основного кода ASP .NET EF для повышения производительности WebAPI
Проблема, с которой я столкнулся, заключается в оптимизации и рефакторинге кода с учетом определенных ограничений, чтобы сократить время ответа WebAPI, разработанного с использованием Entity Framework Core (EF Core). Текущее время отклика составляет примерно 70 мс, но мне нужно значительно его улучшить, стремясь к целевому значению 15–10 мс.
Приведенный ниже код отвечает за получение большого объема данных с помощью EF Core и последующую его обработку. Сюда входит загрузка сложных объектов, обработка связанных данных, а также прикрепление дополнительной информации и обработка вложений. Очень важно отметить, что эти ограничения не позволяют мне изменить ORM EF Core, шаблон архитектуры или дизайн таблиц базы данных.
public async Task GetById(stringСотрудникCode, CancellationToken cancelToken) { varentity = await FilterIQueryable(x => x.Status != SystemStatus.Deleted.GetHashCode() && x.EmployeeCode.ToString() == КодСотрудника) .AsNoTrackingWithIdentityResolution() .AsSingleQuery() .AsQueryable() .Select(x => новый EmployerEmployeeResponse { Идентификатор = x.Id, Статус = x.Статус, StatusDescription = Enum.GetName((SystemStatus)x.Status), КодСотрудника = x.КодСотрудника.ToString(), UserId = x.UserId, Персональный = новый PersonalInfo() { ImagePath = string.IsNullOrEmpty(x.ImagePath)? ноль: x.ImagePath, TitleId = x.TitleId, Название = x.Title.TitleName, Имя = x.Имя, Фамилия = x.Фамилия, FullName = string.Concat(x.FirstName, " ", x.LastName), Электронная почта = x.Электронная почта, ГендерИд = x.ГендерИд, Пол = x.Gender.GenderName, MaritalStatusId = x.MaritalStatusId, СемейноеСтатус = x.MaritalStatus.MaritalStatusName, Месторождения = x.Месторождения, ДатаРождения = x.ДатаРождения, BloodGroupId = x.BloodGroupId, Группа Крови = x.Группа Крови. Имя Группы Крови, }, OrgStructure = новая информация оргструктуры() { OrganizationId = x.OrganizationId, Организация = x.OrgStructure.OrgLevelName, }, Идентификация = новая IdentificationInfo() { NicNumber = x.NicNumber, NicExpiryDate = x.NicExpiryDate, Номер Паспорта = x.Номер Паспорта, PassportExpiryDate = x.PassportExpiryDate, DriverLicenseNumber = x.DriverLicenseNumber, Эмигрант = x.Эмигрант, }, Этнический = новый EthnicInfo() { ReligionId = x.ReligionId, Религия = x.Религия.ИмяРелигии, NationalityId = x.NationalityId, Национальность = x.Nationality.NationalityName, RaceId = x.RaceId, Раса = x.Race.RaceName, }, Жизнь = новая LivingInfo() { LivingId = x.LivingId, Жизнь = x.Living.LivingName, Доход = х.Доход, NoOfChildren = x.NoOfChildren, NoOfDependants = x.NoOfDependants, }, НомерСотрудника = новый НомерСотрудникаИнформация() { НомерСотрудника = x.НомерСотрудника, ЭпфНо = x.ЭпфНо, EtfNo = x.EtfNo, PrevoiusEpfNumber = x.PrevoiusEpfNumber, AttendanceCardNumber = x.AttendanceCardNumber, MacAddress = x.MacAddress, }, WorkPlace = новый WorkPlaceInfo() { OfficeRegion = x.OfficeRegion, OfficeSubRegion = x.OfficeSubRegion, ОфисСити = x.ОфисСити, Офис = х.Офис, }, Общее = новая ОбщаяИнформация() { JobCategoryId = x.JobCategoryId, JobCategory = x.JobCategory.JobCategoryName, ОбозначениеId = x.DesignationId, Обозначение = x.Designation.DesignationName, GradeId = x.GradeId, Оценка = x.Grade.GradeName, SalaryPaymentId = x.SalaryPaymentId, SalaryPayment = x.SalaryPayment.SalaryPaymentName, ReportingPersonId = x.ReportingPersonId, ReportingPerson = string.Concat(x.EmployerEmployeeReporting.FirstName, " ", x.EmployerEmployeeReporting.LastName), ReportingPersonDesignationId = x.EmployerEmployeeReporting.DesignationId, Обозначение Отчетного Лица = x.EmployerEmployeeReporting.Designation.DesignationName, LocationId = x.LocationId, Местоположение = x.Location.LocationName, CostCenterId = x.CostCenterId, Центр затрат = x.CostCenter.CostCenterName, FunctionalReportingPersonId = x.FunctionalReportingPersonId, FunctionalReportingPerson = string.Concat(x.EmployerEmployeeFunctionalReporting.FirstName, " ", x.EmployerEmployeeFunctionalReporting.LastName), }, Заработная плата = новая SalaryInfo() { CurrencyId = x.CurrencyId, Валюта = x.Currency.CurrencyName, Зарплата = x.Зарплата, HousingAmount = x.HousingAmount, БюджетнаяСуммаПомощи = x.БюджетнаяСуммаПомощи, JoinedTypeId = x.JoinedTypeId, JoinedType = x.JoinedType.JoinedTypeName, PensionSchemeId = x.PensionSchemeId, PensionScheme = x.PensionScheme.PensionSchemeName, ParticipedToInduction = x.ParticipedToInduction, ИдНазначения = x.ИдНазначения, ИмяСдвига = x.Shift.ИмяСдвига, В реестре = x.В реестре, НомерГруппы = x.НомерГруппы, }, Назначение = новое AppointmentInfo() { DateOfAppointment = x.DateOfAppointment, ИдентификаторТипаЗанятости = x.ИдентификаторТипаЗанятости, ТипЗанятости = x.ТипЗанятости.ИмяТипа, ДатаПодтверждено = x.ДатаПодтверждено, Сверхурочная работа = x.Сверхурочная работа, DateOfRetirement = x.DateOfRetirement }, Адрес = новый АдресИнформация() { Идентификатор = x.Id, ИмяСотрудника = string.Concat(x.FirstName, " ", x.LastName), PermBuildingAppartment = x.PAddress1, ПермСтрит = x.PAddress2, ПермСити = x.PAddress3, ПермПочтовыйКод = x.PPostalCode, ПермТелефон = x.PTelephone, PermDistrictId = x.PDistrictId, PermDistrict = x.PDistrict.DistrictName, PermCountryId = x.PCountryId, PermCountry = x.PCCountry.CountryName, ResBuildingAppartment = x.RAddress1, ResStreet = x.RAddress2, ResCity = x.RAddress3, ResPostalCode = x.RPostalCode, ResTelephone = x.RTelephone, ResDistrictId = x.RDistrictId, ResDistrict = x.RDistrict.DistrictName, ResCountryId = x.RCountryId, ResCountry = x.RCountry.CountryName, }, Контакт = новый КонтактИнформация() { Идентификатор = x.Id, ИмяСотрудника = string.Concat(x.FirstName, " ", x.LastName), OfficePhone = x.ServicePhone, StaffPhone = x.StaffPhone, Расширение = x.Расширение, НомерИмеи = x.НомерИмей, PersonalEmail = x.OptionalEmail, PersonalContactNo = x.MobileNumber, SkypeId = x.SkypeId, LinkedInId = x.LinkedInId, }, Местоположение = новое LocationInfo() { Идентификатор = x.Id, ИмяСотрудника = string.Concat(x.FirstName, " ", x.LastName), CountryId = x.CountryId, Страна = x.Страна.ИмяСтраны, ИдПровинции = x.ИдПровинции, Провинция = x.Province.ProvinceName, DistrictId = x.DistrictId, Район = x.District.DistrictName, ElectorateId = x.ElectorateId, Электорат = x.Electorate.ElectorateName, PollingDivisionId = x.PollingDivisionId, PollingDivision = x.PollingDivision.PollingStationName, TravelModeId = x.TravelModeId, TravelMode = x.TravelMode.TravelModeName, PoliceStationId = x.PoliceStationId, PoliceStation = x.PoliceStation.PoliceStationName, DistanceFromWorkPlace = x.DistanceFromWorkPlace, }, FamilyMembers = x.FamilyMembers.Select(z => новый EmployerFamilyMemberResponse { Идентификатор = z.Id, Идентификатор Сотрудника = z.ИдСотрудника, ИдентификаторТипаОтношения = z.ИдТипаОтношения, ИмяТипаОтношения = z.ТипОтношения.ИмяТипаОтношения, Имя = z.FirstName, Фамилия = z.Фамилия, FullName = string.Concat(z.FirstName, " ", z.LastName), ДатаРождения = z.ДатаРождения, Отключено = z.Отключено, Род занятий = z.Профессия, Жив = z.Жив, Работодатель = z.Работодатель, MedicalEntitled = z.MedicalEntitled, Контактный номер = z.Контактный номер, Адрес = z.Адрес, NICNumber = z.NICNumber, NICExpiryDate = z.NICExpiryDate, PassportExpiryDate = z.PassportExpiryDate, Номер Паспорта = z.Номер Паспорта, Статус = z.Статус }).К списку(), Навыки = x.Skills.Select(emp => новый EmployerSkillResponse { Идентификатор = emp.Id, Идентификатор Сотрудника = emp.ИдСотрудника, ИмяСотрудника = string.Concat(emp.Employee.FirstName, " ", emp.Employee.LastName), SkillCategoryId = emp.Skill.SkillCategoryId, SkillCategoryName = emp.Skill.SkillCategory.SkillCategoryName, SkillId = emp.SkillId, ИмяНавыка = emp.Навык.ИмяНавыка, Описание навыка = emp.Описание навыка, Статус = emp.Status }).К списку(), Health = x.HealthRecords.Select(h => новый EmployerHealthResponse { Идентификатор = h.Id, Идентификатор Сотрудника = h.ИдСотрудника, ИмяСотрудника = string.Concat(h.Employee.FirstName, " ", ч.Сотрудник.Фамилия), Болезнь = ч.Болезнь, FromDate = h.FromDate, ToDate = h.ToDate, Госпитализирован = ч. Госпитализирован, Комментарии = h.Комментарии, AttachedDocument = string.IsNullOrEmpty(h.AttachedDocument)? string.Empty: h.AttachedDocument, Статус = h.Статус }).К списку(), Preference = x.Preferences.Select(p => новый EmployerPreferenceResponse { Ид = п.Ид, Идентификатор Сотрудника = p.ИдСотрудника, ИмяСотрудника = string.Concat(p.Employee.FirstName, " ", p.Employee.LastName), PreferenceId = p.PreferenceId, PreferenceName = p.Preference.PreferenceName, PreferenceCategoryId = p.Preference.PreferenceCategoryId, PreferenceCategoryName = p.Preference.PreferenceCategory.PreferenceCategoryName, FromDate = p.FromDate, ToDate = p.ToDate, Комментарии = п.Комментарии, Статус = п.Статус }).К списку(), Лицензия = x.Licenses.Select(l => новый EmployerLicenseResponse { Ид = л.Ид, Идентификатор Сотрудника = l.ИдСотрудника, ИмяСотрудника = string.Concat(l.Employee.FirstName, " ", l.Employee.LastName), LicenseTypeId = l.LicenseTypeId, LicenseType = l.LicenseType.LicenseTypeName, Номер Лицензии = l.Номер Лицензии, ДатаВыпуска = l.ДатаВыпуска, Дата истечения = l.Дата истечения, Примечания = l.Примечания, Статус = l.Статус }).К списку(), Законодательный = x.StatutoryDetails.Select(s => новый EmployerStatutoryResponse { Идентификатор = s.Id, идентификатор сотрудника = s.EmployeeId, ИмяСотрудника = string.Concat(s.Employee.FirstName, " ", s.Employee.LastName), EnableSocialSecurity = s.EnableSocialSecurity, SocialSecurity = s.SocialSecurity, SocialSecurityDate = s.SocialSecurityDate, EnableEobi = s.EnableEobi, Эоби = с.Эоби, EobiDate = s.EobiDate, EnableGratuity = s.EnableGratuity, GratuityDate = s.GratuityDate, EnablePfEntitlement = s.EnablePfEntitlement, PfEntitlement = s.PfEntitlement, PfEntitlementDate = s.PfEntitlementDate, EnableWppf = s.EnableWppf, Вппф = с.Вппф, EnableProvidentFundInterest = s.EnableProvidentFundInterest, EnableTaxEntitlement = s.EnableTaxEntitlement, TaxEntitlement = s.TaxEntitlement, EnablePension = s.EnablePension, PensionDate = с.PensionDate, Статус = с.Статус }).FirstOrDefault(), КриминальнаяРекорд = x.CriminalDetails.Select(cri => новый EmployerCriminalRecordResponse { Идентификатор = кри.Ид, Идентификатор Сотрудника = cri.ИдСотрудника, ИмяСотрудника = string.Concat(cri.Employee.FirstName, " ", cri.Employee.LastName), CriminalResultTypeId = cri.CriminalResultTypeId, ИмяТипаКриминальногоРезультата = cri.ТипКриминальногоРезультата.ИмяТипаКриминальногоРезультата, ИдентификаторТипаПреступника = cri.ИдентификаторТипаПреступника, ИмяТипаПреступника = cri.ТипПреступника.ИмяТипа Преступника, DisclosureRequestedDate = cri.DisclosureRequestedDate, Удовлетворительно = кри.Удовлетворительно, DisclosureReceivedDate = cri.DisclosureReceivedDate, DateOfCommited = cri.DateOfCommitted, DisclosureReferenceNumber = cri.DisclosureReferenceNumber, ValidFrom = cri.ValidFrom, ValidTo = cri.ValidTo, IsaRegistrationNumber = cri.IsaRegistrationNumber, Замечания = кри.Замечания, AttachedDocument = string.IsNullOrEmpty(cri.AttachedDocuments)? string.Empty: cri.AttachedDocuments, Статус = кри.Статус }).К списку(), BankAccount = x.BankDetails.Select(b => новый EmployerBankAccountResponse { Ид = б.Ид, Идентификатор Сотрудника = b.ИдСотрудника, ИмяСотрудника = string.Concat(b.Employee.FirstName, " ", b.Employee.LastName), BankId = b.BankBranch.BankId, ИмяБанка = b.БанкФилиал.Банк.НазваниеБанка, BranchId = b.BranchId, ИмяФилиала = b.BankBranch.НазваниеФилиала, Номер Банковского Счета = b.Номер Банковского Счета, BankAccountName = b.BankAccountName, SwiftCode = b.SwiftCode, Сумма = b.Сумма, RemitRemainingAmount = b.RemitRemainingAmount, Номер Последовательности = b.Номер Последовательности, IsDefault = b.IsDefault, Статус = б.Статус }).К списку(), IssuedItem = x.ItemIssueDetails.Select (i => новый EmployerItemIssuesResponse { Идентификатор = i.Id, Идентификатор Сотрудника = i.ИдСотрудника, ИмяСотрудника = string.Concat(i.Employee.FirstName, " ", т.е.Сотрудник.Фамилия), ItemGroupId = i.Item.ItemGroupId, ItemGroupName = i.Item.IssueItemGroup.GroupName, ItemId = i.ItemId, ItemName = i.Item.ItemName, Количество = i.Количество, Дата выпуска = i.Дата выпуска, Дата Возврата = i.Дата Возврата, ВозвратКомментарий = i.ReturnComment, Комментарии = i.Комментарии, Завершено = i.Завершено, SaveItem = i.SaveItem, ReturnQty = i.ReturnQty, AttachedDocuments = string.IsNullOrEmpty(i.AttachedDocuments)? string.Empty: i.AttachedDocuments, Статус = i.Status }).К списку(), Insurance = x.InsuranceDetails.Select(ins => новый EmployerInsuranceResponse { Идентификатор = ins.Id, Идентификатор Сотрудника = ins.ИдСотрудника, ИмяСотрудника = string.Concat(ins.Employee.FirstName, " ", ins.Employee.LastName), InsCompanyId = ins.InsCompanyId, InsCompanyName = ins.Insurance.InsuranceName, InsSchemeId = ins.InsSchemeId, InsSchemeName = ins.InsuranceScheme.SchemeName, Номер Политики = ins.Номер Политики, InsuranceExpiryDate = ins.InsuranceExpiryDate, Дата выпуска = ins.Дата выпуска, Статус = ins.Status }).К списку(), WorkPermit = x.WorkPermitDetails.Select(wrk => новый EmployerWorkPermitResponse { Идентификатор = рабочий.Идентификатор, ИдСотрудника = wrk.ИдСотрудника, ИмяСотрудника = string.Concat(wrk.Employee.FirstName, " ", wrk.Employee.LastName), WorkPermitNumber = wrk.WorkPermitNumber, Комментарий = работа.Комментарий, Дата истечения = wrk.Дата истечения, ДатаВыпуска = wrk.ДатаВыпуска, Статус = работа.Статус }).К списку(), Visa = x.VisaDetails.Select(v => новый EmployerVisaResponse { Идентификатор = v.Id, Идентификатор Сотрудника = v.ИдСотрудника, ИмяСотрудника = string.Concat(v.Employee.FirstName, " ", v.Employee.LastName), VisaNumber = v.VisaNumber, Имя Спонсора = v.Имя Спонсора, VisaExpiryDate = v.VisaExpiryDate, VisaIssueDate = v.VisaIssueDate, VisaDetails = v.VisaDetails, Статус = v.Статус }).К списку(), Квалификация = x.QualificationDetails.Select(q => новый EmployerQualificationResponse { Ид = q.Id, Идентификатор Сотрудника = q.ИдСотрудника, ИмяСотрудника = string.Concat(q.Employee.FirstName, " ", q.Employee.LastName), QualificationTypeId = q.Qualification.QualificationTypeId, ИмяТипа Квалификации = q.Квалификация.Тип Квалификации.ИмяТипа Квалификации, Идентификатор квалификации = q.Идентификатор квалификации, ИмяКвалификации = q.Квалификация.ИмяКвалификации, InstituteId = q.InstituteId, ИмяИнститута = q.Институт.ИмяИнститута, FromMonth = q.FromMonth, FromYear = q.FromYear, ToMonth = q.ToMonth, ToYear = q.ToYear, QualificationStateId = q.QualificationStateId, ИмяСостоянияКвалификации = q.СостояниеКвалификации.ИмяСостояния, Номер ссылки = q.Номер ссылки, Высшая квалификация = q.Высшая квалификация, Примечания = q.Примечания, AttachedDocument = string.IsNullOrEmpty(q.AttachedDocument)? string.Empty: q.AttachedDocument, Статус = q.Статус, FromDate = q.FromYear > 0 && q.FromMonth > 0 ? "1" + "-" + q.FromYear + "-" + q.FromMonth : string.Empty, ToDate = q.ToYear > 0 && q.ToMonth > 0 ? «1» + «-» + q.ToYear + «-» + q.ToMonth : string.Empty, }).К списку(), Членство = x.MembershipDetails.Select(m => новый EmployerMembershipResponse { Ид = м.Ид, EmployerId = m.EmployeeId, ИмяСотрудника = string.Concat(m.Employee.FirstName, " ", m.Employee.LastName), ProfessionalBodyId = m.ProfessionalBodyId, ProfessionalBodyName = m.ProfessionalBody.ProfessionalName, Тип Членства = m.Тип Членства, Номер Членства = m.Номер Членства, Статус Членства = m.Статус Членства, ДатаДопуска = m.ДатаДопуска, MembershipExpiryDate = m.MembershipExpiryDate, SubscriptionAmount = m.SubscriptionAmount, SubscriptionCurrencyId = m.SubscriptionCurrencyId, ИмяВалютыПодписки = m.ВалютаПодписки.ИмяВалюты, CompanyPaidAmount = m.CompanyPaidAmount, CompanyPaidCurrencyId = m.CompanyPaidCurrencyId, CompanyPaidCurrencyName = m.CompanyPaidCurrency.CurrencyName, Комментарии = m.Комментарии, AttachedDocument = string.IsNullOrEmpty(m.AttachedDocument)? string.Empty: m.AttachedDocument, Статус = м.Статус }).К списку(), EmergencyContacts = x.EmergencyDetails.Select(em => новый работодательEmergencyContactResponse { Идентификатор = em.Id, Идентификатор Сотрудника = em.ИдСотрудника, ИмяСотрудника = string.Concat(em.Employee.FirstName, " ", em.Employee.LastName), ИдентификаторТипаОтношения = em.ИдТипаОтношения, ИмяТипаОтношения = em.ТипОтношения.ИмяТипаОтношения, ПолноеИмя = em.ПолноеИмя, MobileNumber = em.MobileNumber, Электронная почта = em.Электронная почта, Адрес = em.Адрес, Статус = em.Status }).К списку(), WorkExperiences = x.ExperienceDetails.Select(wrkExp => новый EmployerWorkExperienceResponse { Идентификатор = wrkExp.Id, Идентификатор Сотрудника = wrkExp.ИдСотрудника, ИмяСотрудника = string.Concat(wrkExp.Employee.FirstName, " ", wrkExp.Employee.LastName), ИмяКомпании = wrkExp.ИмяКомпании, JoinedAs = wrkExp.JoinedAs, PositionHeld = wrkExp.PositionHeld, JoinedDate = wrkExp.JoinedDate, ResignedDate = wrkExp.ResignedDate, CurrencyId = wrkExp.CurrencyId, Валюта = wrkExp.Currency.ИмяВалюты, LastDrawnSalary = wrkExp.LastDrawnSalary, PrevoiusEpfNumber = wrkExp.PrevoiusEpfNumber, LeaveReasonId = wrkExp.LeaveReasonId, LeaveReason = wrkExp.LeaveReason.LeaveReasonName, ReasonToLeave = wrkExp.ReasonToLeave, ТипОпыта = wrkExp.ТипОпыта, Годы = wrkExp.Годы, Месяцы = wrkExp.Months, Примечания = wrkExp.Remarks, AttachedDocument = string.IsNullOrEmpty(wrkExp.AttachedDocument)? строка.Пусто: wrkExp.AttachedDocument, Статус = wrkExp.Status }).К списку(), Награды = x.AwardDetails.Where(y => y.IsAward == true).Select(awr => new EmployerAccomplishmentResponse { Идентификатор = awr.Id, ИдСотрудника = awr.ИдСотрудника, ИмяСотрудника = string.Concat(awr.Employee.FirstName, " ", awr.Employee.LastName), ИмяНаграды = awr.ИмяНаграды, Год = awr.Год, Комментарии = awr.Комментарии, IsAward = awr.IsAward, AttachedDocument = string.IsNullOrEmpty(awr.AttachedDocument)? string.Empty: awr.AttachedDocument, Статус = awr.Status }).К списку(), Стипендии = x.AwardDetails.Where(y => y.IsAward == false).Select(sch => new EmployerAccomplishmentResponse { Идентификатор = ш.Ид, Идентификатор Сотрудника = sch.ИдСотрудника, ИмяСотрудника = string.Concat(sch.Employee.FirstName, " ", sch.Employee.LastName), ИмяНаграды = имяНаграды, Год = сч.Год, Комментарии = сч.Комментарии, IsAward = sch.IsAward, AttachedDocument = string.IsNullOrEmpty(sch.AttachedDocument)? строка.Пусто: sch.AttachedDocument, Статус = схем.Статус }).К списку(), Сертификаты = x.CertificationDetails.Select(c => новый EmployerCertificationResponse { Идентификатор = c.Id, Статус = c.Статус, СертификатТипаИд = c.CertificateTypeId, Имя Сертификата = c.Имя Сертификата, DateEnd = c.DateEnd, DateStart = c.DateStart, ИмяТипа Сертификата = c.Тип Сертификата.ИмяТипа Сертификата, AttachedDocument = string.IsNullOrEmpty(c.AttachedDocument)? string.Empty: c.AttachedDocument, }).К списку() }).SingleOrDefaultAsync(cancellationToken); entity.Documents = _empDocument.GetByEmployeeId(entity.Id); если (сущность!= ноль) { если (!string.IsNullOrEmpty(entity.Personal.ImagePath)) { entity.Personal.ImagePath = GetFirstFileInDirectory(entity.Personal.ImagePath, AppSetting.DocumentUrl); } если (entity.Personal.DateOfBirth! = ноль) { entity.Personal.Age = CalculateAgeByDateOfBirth(entity.Personal.DateOfBirth); } если (entity.UserId! = ноль) { вар roleDetails = _userDetail.GetUserRoleById(entity.UserId.Value, cancelToken); если (roleDetails != ноль) { entity.Personal.RoleId = roleDetails.Item2; entity.Personal.Role = roleDetails.Item1; } } если (entity.FamilyMembers.Count() > 0) { foreach (элемент var в объекте.FamilyMembers) { if (item.DateOfBirth не равен нулю) item.Age = CalculateAgeByDateOfBirth(item.DateOfBirth); } } ProcessItemsWithAttachedDocument(entity.Health, item => item.AttachedDocument, (элемент, вложение) => item.Attachments = вложение); ProcessItemsWithAttachedDocument(entity.CriminalRecord, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocuments = вложение); ProcessItemsWithAttachedDocument(entity.Qualification, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocuments = вложение); ProcessItemsWithAttachedDocument(entity.Memberships, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocuments = вложение); ProcessItemsWithAttachedDocument(entity.WorkExperiences, элемент => элемент.ПрикрепленныйДокумент, (элемент, вложение) => элемент.Вложения = вложение); ProcessItemsWithAttachedDocument(entity.Awards, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocument = Attachment?.FirstOrDefault()); ProcessItemsWithAttachedDocument(entity.Scholarships, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocument = Attachment?.FirstOrDefault()); ProcessItemsWithAttachedDocument(entity.Certifications, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocument = Attachment?.FirstOrDefault()); ProcessItemsWithAttachedDocument(entity.Documents, item => item.AttachedDocument, (item, Attachment) => item.Attachments = Attachment); } вернуть новый GenericResponse { сообщение = _systemMessages.Success, код = HttpStatusCode.OK, результат = сущность }; } Я предоставил фрагмент кода, который нуждается в оптимизации, а также ниже представлены вспомогательные функции, используемые в этом процессе.
string GetFirstFileInDirectory(строка пути, строка documentUrl) { вар SplitPath = path.Split("/"); return FileManipulation.GetAllFilesInDirectory(splitPath[1], SplitPath[2], documentUrl)?.FirstOrDefault(); } void ProcessItemsWithAttachedDocument( Элементы IEnumerable, Func documentSelector, Action присваиваниеAction) { foreach (элемент var в items.Where(item => !string.IsNullOrEmpty(documentSelector(item)))) { var SplitPath = documentSelector(item).Split("/"); var Attachments = FileManipulation.GetAllFilesInDirectory(splitPath[1], SplitPath[2], AppSetting.DocumentUrl); присваиваниеAction(элемент, вложения); } } общедоступный статический список GetAllFilesInDirectory (строка _forFolderName, строка _directoryName, строка DocumentURL) { Файлы List = новый List(); var _directoryPath = Path.Combine(AppSetting.DocumentPath, «Документы», _forFolderName, _directoryName); если (Directory.Exists(_directoryPath)) { файлы = Directory.GetFiles(_directoryPath).ToList(); for (int i = 0; я
Проблема, с которой я столкнулся, заключается в оптимизации и рефакторинге кода с учетом определенных ограничений, чтобы сократить время ответа WebAPI, разработанного с использованием Entity Framework Core (EF Core). Текущее время отклика составляет примерно 70 мс, но мне нужно значительно его улучшить, стремясь к целевому значению 15–10 мс.
Приведенный ниже код отвечает за получение большого объема данных с помощью EF Core и последующую его обработку. Сюда входит загрузка сложных объектов, обработка связанных данных, а также прикрепление дополнительной информации и обработка вложений. Очень важно отметить, что эти ограничения не позволяют мне изменить ORM EF Core, шаблон архитектуры или дизайн таблиц базы данных.
public async Task GetById(stringСотрудникCode, CancellationToken cancelToken) { varentity = await FilterIQueryable(x => x.Status != SystemStatus.Deleted.GetHashCode() && x.EmployeeCode.ToString() == КодСотрудника) .AsNoTrackingWithIdentityResolution() .AsSingleQuery() .AsQueryable() .Select(x => новый EmployerEmployeeResponse { Идентификатор = x.Id, Статус = x.Статус, StatusDescription = Enum.GetName((SystemStatus)x.Status), КодСотрудника = x.КодСотрудника.ToString(), UserId = x.UserId, Персональный = новый PersonalInfo() { ImagePath = string.IsNullOrEmpty(x.ImagePath)? ноль: x.ImagePath, TitleId = x.TitleId, Название = x.Title.TitleName, Имя = x.Имя, Фамилия = x.Фамилия, FullName = string.Concat(x.FirstName, " ", x.LastName), Электронная почта = x.Электронная почта, ГендерИд = x.ГендерИд, Пол = x.Gender.GenderName, MaritalStatusId = x.MaritalStatusId, СемейноеСтатус = x.MaritalStatus.MaritalStatusName, Месторождения = x.Месторождения, ДатаРождения = x.ДатаРождения, BloodGroupId = x.BloodGroupId, Группа Крови = x.Группа Крови. Имя Группы Крови, }, OrgStructure = новая информация оргструктуры() { OrganizationId = x.OrganizationId, Организация = x.OrgStructure.OrgLevelName, }, Идентификация = новая IdentificationInfo() { NicNumber = x.NicNumber, NicExpiryDate = x.NicExpiryDate, Номер Паспорта = x.Номер Паспорта, PassportExpiryDate = x.PassportExpiryDate, DriverLicenseNumber = x.DriverLicenseNumber, Эмигрант = x.Эмигрант, }, Этнический = новый EthnicInfo() { ReligionId = x.ReligionId, Религия = x.Религия.ИмяРелигии, NationalityId = x.NationalityId, Национальность = x.Nationality.NationalityName, RaceId = x.RaceId, Раса = x.Race.RaceName, }, Жизнь = новая LivingInfo() { LivingId = x.LivingId, Жизнь = x.Living.LivingName, Доход = х.Доход, NoOfChildren = x.NoOfChildren, NoOfDependants = x.NoOfDependants, }, НомерСотрудника = новый НомерСотрудникаИнформация() { НомерСотрудника = x.НомерСотрудника, ЭпфНо = x.ЭпфНо, EtfNo = x.EtfNo, PrevoiusEpfNumber = x.PrevoiusEpfNumber, AttendanceCardNumber = x.AttendanceCardNumber, MacAddress = x.MacAddress, }, WorkPlace = новый WorkPlaceInfo() { OfficeRegion = x.OfficeRegion, OfficeSubRegion = x.OfficeSubRegion, ОфисСити = x.ОфисСити, Офис = х.Офис, }, Общее = новая ОбщаяИнформация() { JobCategoryId = x.JobCategoryId, JobCategory = x.JobCategory.JobCategoryName, ОбозначениеId = x.DesignationId, Обозначение = x.Designation.DesignationName, GradeId = x.GradeId, Оценка = x.Grade.GradeName, SalaryPaymentId = x.SalaryPaymentId, SalaryPayment = x.SalaryPayment.SalaryPaymentName, ReportingPersonId = x.ReportingPersonId, ReportingPerson = string.Concat(x.EmployerEmployeeReporting.FirstName, " ", x.EmployerEmployeeReporting.LastName), ReportingPersonDesignationId = x.EmployerEmployeeReporting.DesignationId, Обозначение Отчетного Лица = x.EmployerEmployeeReporting.Designation.DesignationName, LocationId = x.LocationId, Местоположение = x.Location.LocationName, CostCenterId = x.CostCenterId, Центр затрат = x.CostCenter.CostCenterName, FunctionalReportingPersonId = x.FunctionalReportingPersonId, FunctionalReportingPerson = string.Concat(x.EmployerEmployeeFunctionalReporting.FirstName, " ", x.EmployerEmployeeFunctionalReporting.LastName), }, Заработная плата = новая SalaryInfo() { CurrencyId = x.CurrencyId, Валюта = x.Currency.CurrencyName, Зарплата = x.Зарплата, HousingAmount = x.HousingAmount, БюджетнаяСуммаПомощи = x.БюджетнаяСуммаПомощи, JoinedTypeId = x.JoinedTypeId, JoinedType = x.JoinedType.JoinedTypeName, PensionSchemeId = x.PensionSchemeId, PensionScheme = x.PensionScheme.PensionSchemeName, ParticipedToInduction = x.ParticipedToInduction, ИдНазначения = x.ИдНазначения, ИмяСдвига = x.Shift.ИмяСдвига, В реестре = x.В реестре, НомерГруппы = x.НомерГруппы, }, Назначение = новое AppointmentInfo() { DateOfAppointment = x.DateOfAppointment, ИдентификаторТипаЗанятости = x.ИдентификаторТипаЗанятости, ТипЗанятости = x.ТипЗанятости.ИмяТипа, ДатаПодтверждено = x.ДатаПодтверждено, Сверхурочная работа = x.Сверхурочная работа, DateOfRetirement = x.DateOfRetirement }, Адрес = новый АдресИнформация() { Идентификатор = x.Id, ИмяСотрудника = string.Concat(x.FirstName, " ", x.LastName), PermBuildingAppartment = x.PAddress1, ПермСтрит = x.PAddress2, ПермСити = x.PAddress3, ПермПочтовыйКод = x.PPostalCode, ПермТелефон = x.PTelephone, PermDistrictId = x.PDistrictId, PermDistrict = x.PDistrict.DistrictName, PermCountryId = x.PCountryId, PermCountry = x.PCCountry.CountryName, ResBuildingAppartment = x.RAddress1, ResStreet = x.RAddress2, ResCity = x.RAddress3, ResPostalCode = x.RPostalCode, ResTelephone = x.RTelephone, ResDistrictId = x.RDistrictId, ResDistrict = x.RDistrict.DistrictName, ResCountryId = x.RCountryId, ResCountry = x.RCountry.CountryName, }, Контакт = новый КонтактИнформация() { Идентификатор = x.Id, ИмяСотрудника = string.Concat(x.FirstName, " ", x.LastName), OfficePhone = x.ServicePhone, StaffPhone = x.StaffPhone, Расширение = x.Расширение, НомерИмеи = x.НомерИмей, PersonalEmail = x.OptionalEmail, PersonalContactNo = x.MobileNumber, SkypeId = x.SkypeId, LinkedInId = x.LinkedInId, }, Местоположение = новое LocationInfo() { Идентификатор = x.Id, ИмяСотрудника = string.Concat(x.FirstName, " ", x.LastName), CountryId = x.CountryId, Страна = x.Страна.ИмяСтраны, ИдПровинции = x.ИдПровинции, Провинция = x.Province.ProvinceName, DistrictId = x.DistrictId, Район = x.District.DistrictName, ElectorateId = x.ElectorateId, Электорат = x.Electorate.ElectorateName, PollingDivisionId = x.PollingDivisionId, PollingDivision = x.PollingDivision.PollingStationName, TravelModeId = x.TravelModeId, TravelMode = x.TravelMode.TravelModeName, PoliceStationId = x.PoliceStationId, PoliceStation = x.PoliceStation.PoliceStationName, DistanceFromWorkPlace = x.DistanceFromWorkPlace, }, FamilyMembers = x.FamilyMembers.Select(z => новый EmployerFamilyMemberResponse { Идентификатор = z.Id, Идентификатор Сотрудника = z.ИдСотрудника, ИдентификаторТипаОтношения = z.ИдТипаОтношения, ИмяТипаОтношения = z.ТипОтношения.ИмяТипаОтношения, Имя = z.FirstName, Фамилия = z.Фамилия, FullName = string.Concat(z.FirstName, " ", z.LastName), ДатаРождения = z.ДатаРождения, Отключено = z.Отключено, Род занятий = z.Профессия, Жив = z.Жив, Работодатель = z.Работодатель, MedicalEntitled = z.MedicalEntitled, Контактный номер = z.Контактный номер, Адрес = z.Адрес, NICNumber = z.NICNumber, NICExpiryDate = z.NICExpiryDate, PassportExpiryDate = z.PassportExpiryDate, Номер Паспорта = z.Номер Паспорта, Статус = z.Статус }).К списку(), Навыки = x.Skills.Select(emp => новый EmployerSkillResponse { Идентификатор = emp.Id, Идентификатор Сотрудника = emp.ИдСотрудника, ИмяСотрудника = string.Concat(emp.Employee.FirstName, " ", emp.Employee.LastName), SkillCategoryId = emp.Skill.SkillCategoryId, SkillCategoryName = emp.Skill.SkillCategory.SkillCategoryName, SkillId = emp.SkillId, ИмяНавыка = emp.Навык.ИмяНавыка, Описание навыка = emp.Описание навыка, Статус = emp.Status }).К списку(), Health = x.HealthRecords.Select(h => новый EmployerHealthResponse { Идентификатор = h.Id, Идентификатор Сотрудника = h.ИдСотрудника, ИмяСотрудника = string.Concat(h.Employee.FirstName, " ", ч.Сотрудник.Фамилия), Болезнь = ч.Болезнь, FromDate = h.FromDate, ToDate = h.ToDate, Госпитализирован = ч. Госпитализирован, Комментарии = h.Комментарии, AttachedDocument = string.IsNullOrEmpty(h.AttachedDocument)? string.Empty: h.AttachedDocument, Статус = h.Статус }).К списку(), Preference = x.Preferences.Select(p => новый EmployerPreferenceResponse { Ид = п.Ид, Идентификатор Сотрудника = p.ИдСотрудника, ИмяСотрудника = string.Concat(p.Employee.FirstName, " ", p.Employee.LastName), PreferenceId = p.PreferenceId, PreferenceName = p.Preference.PreferenceName, PreferenceCategoryId = p.Preference.PreferenceCategoryId, PreferenceCategoryName = p.Preference.PreferenceCategory.PreferenceCategoryName, FromDate = p.FromDate, ToDate = p.ToDate, Комментарии = п.Комментарии, Статус = п.Статус }).К списку(), Лицензия = x.Licenses.Select(l => новый EmployerLicenseResponse { Ид = л.Ид, Идентификатор Сотрудника = l.ИдСотрудника, ИмяСотрудника = string.Concat(l.Employee.FirstName, " ", l.Employee.LastName), LicenseTypeId = l.LicenseTypeId, LicenseType = l.LicenseType.LicenseTypeName, Номер Лицензии = l.Номер Лицензии, ДатаВыпуска = l.ДатаВыпуска, Дата истечения = l.Дата истечения, Примечания = l.Примечания, Статус = l.Статус }).К списку(), Законодательный = x.StatutoryDetails.Select(s => новый EmployerStatutoryResponse { Идентификатор = s.Id, идентификатор сотрудника = s.EmployeeId, ИмяСотрудника = string.Concat(s.Employee.FirstName, " ", s.Employee.LastName), EnableSocialSecurity = s.EnableSocialSecurity, SocialSecurity = s.SocialSecurity, SocialSecurityDate = s.SocialSecurityDate, EnableEobi = s.EnableEobi, Эоби = с.Эоби, EobiDate = s.EobiDate, EnableGratuity = s.EnableGratuity, GratuityDate = s.GratuityDate, EnablePfEntitlement = s.EnablePfEntitlement, PfEntitlement = s.PfEntitlement, PfEntitlementDate = s.PfEntitlementDate, EnableWppf = s.EnableWppf, Вппф = с.Вппф, EnableProvidentFundInterest = s.EnableProvidentFundInterest, EnableTaxEntitlement = s.EnableTaxEntitlement, TaxEntitlement = s.TaxEntitlement, EnablePension = s.EnablePension, PensionDate = с.PensionDate, Статус = с.Статус }).FirstOrDefault(), КриминальнаяРекорд = x.CriminalDetails.Select(cri => новый EmployerCriminalRecordResponse { Идентификатор = кри.Ид, Идентификатор Сотрудника = cri.ИдСотрудника, ИмяСотрудника = string.Concat(cri.Employee.FirstName, " ", cri.Employee.LastName), CriminalResultTypeId = cri.CriminalResultTypeId, ИмяТипаКриминальногоРезультата = cri.ТипКриминальногоРезультата.ИмяТипаКриминальногоРезультата, ИдентификаторТипаПреступника = cri.ИдентификаторТипаПреступника, ИмяТипаПреступника = cri.ТипПреступника.ИмяТипа Преступника, DisclosureRequestedDate = cri.DisclosureRequestedDate, Удовлетворительно = кри.Удовлетворительно, DisclosureReceivedDate = cri.DisclosureReceivedDate, DateOfCommited = cri.DateOfCommitted, DisclosureReferenceNumber = cri.DisclosureReferenceNumber, ValidFrom = cri.ValidFrom, ValidTo = cri.ValidTo, IsaRegistrationNumber = cri.IsaRegistrationNumber, Замечания = кри.Замечания, AttachedDocument = string.IsNullOrEmpty(cri.AttachedDocuments)? string.Empty: cri.AttachedDocuments, Статус = кри.Статус }).К списку(), BankAccount = x.BankDetails.Select(b => новый EmployerBankAccountResponse { Ид = б.Ид, Идентификатор Сотрудника = b.ИдСотрудника, ИмяСотрудника = string.Concat(b.Employee.FirstName, " ", b.Employee.LastName), BankId = b.BankBranch.BankId, ИмяБанка = b.БанкФилиал.Банк.НазваниеБанка, BranchId = b.BranchId, ИмяФилиала = b.BankBranch.НазваниеФилиала, Номер Банковского Счета = b.Номер Банковского Счета, BankAccountName = b.BankAccountName, SwiftCode = b.SwiftCode, Сумма = b.Сумма, RemitRemainingAmount = b.RemitRemainingAmount, Номер Последовательности = b.Номер Последовательности, IsDefault = b.IsDefault, Статус = б.Статус }).К списку(), IssuedItem = x.ItemIssueDetails.Select (i => новый EmployerItemIssuesResponse { Идентификатор = i.Id, Идентификатор Сотрудника = i.ИдСотрудника, ИмяСотрудника = string.Concat(i.Employee.FirstName, " ", т.е.Сотрудник.Фамилия), ItemGroupId = i.Item.ItemGroupId, ItemGroupName = i.Item.IssueItemGroup.GroupName, ItemId = i.ItemId, ItemName = i.Item.ItemName, Количество = i.Количество, Дата выпуска = i.Дата выпуска, Дата Возврата = i.Дата Возврата, ВозвратКомментарий = i.ReturnComment, Комментарии = i.Комментарии, Завершено = i.Завершено, SaveItem = i.SaveItem, ReturnQty = i.ReturnQty, AttachedDocuments = string.IsNullOrEmpty(i.AttachedDocuments)? string.Empty: i.AttachedDocuments, Статус = i.Status }).К списку(), Insurance = x.InsuranceDetails.Select(ins => новый EmployerInsuranceResponse { Идентификатор = ins.Id, Идентификатор Сотрудника = ins.ИдСотрудника, ИмяСотрудника = string.Concat(ins.Employee.FirstName, " ", ins.Employee.LastName), InsCompanyId = ins.InsCompanyId, InsCompanyName = ins.Insurance.InsuranceName, InsSchemeId = ins.InsSchemeId, InsSchemeName = ins.InsuranceScheme.SchemeName, Номер Политики = ins.Номер Политики, InsuranceExpiryDate = ins.InsuranceExpiryDate, Дата выпуска = ins.Дата выпуска, Статус = ins.Status }).К списку(), WorkPermit = x.WorkPermitDetails.Select(wrk => новый EmployerWorkPermitResponse { Идентификатор = рабочий.Идентификатор, ИдСотрудника = wrk.ИдСотрудника, ИмяСотрудника = string.Concat(wrk.Employee.FirstName, " ", wrk.Employee.LastName), WorkPermitNumber = wrk.WorkPermitNumber, Комментарий = работа.Комментарий, Дата истечения = wrk.Дата истечения, ДатаВыпуска = wrk.ДатаВыпуска, Статус = работа.Статус }).К списку(), Visa = x.VisaDetails.Select(v => новый EmployerVisaResponse { Идентификатор = v.Id, Идентификатор Сотрудника = v.ИдСотрудника, ИмяСотрудника = string.Concat(v.Employee.FirstName, " ", v.Employee.LastName), VisaNumber = v.VisaNumber, Имя Спонсора = v.Имя Спонсора, VisaExpiryDate = v.VisaExpiryDate, VisaIssueDate = v.VisaIssueDate, VisaDetails = v.VisaDetails, Статус = v.Статус }).К списку(), Квалификация = x.QualificationDetails.Select(q => новый EmployerQualificationResponse { Ид = q.Id, Идентификатор Сотрудника = q.ИдСотрудника, ИмяСотрудника = string.Concat(q.Employee.FirstName, " ", q.Employee.LastName), QualificationTypeId = q.Qualification.QualificationTypeId, ИмяТипа Квалификации = q.Квалификация.Тип Квалификации.ИмяТипа Квалификации, Идентификатор квалификации = q.Идентификатор квалификации, ИмяКвалификации = q.Квалификация.ИмяКвалификации, InstituteId = q.InstituteId, ИмяИнститута = q.Институт.ИмяИнститута, FromMonth = q.FromMonth, FromYear = q.FromYear, ToMonth = q.ToMonth, ToYear = q.ToYear, QualificationStateId = q.QualificationStateId, ИмяСостоянияКвалификации = q.СостояниеКвалификации.ИмяСостояния, Номер ссылки = q.Номер ссылки, Высшая квалификация = q.Высшая квалификация, Примечания = q.Примечания, AttachedDocument = string.IsNullOrEmpty(q.AttachedDocument)? string.Empty: q.AttachedDocument, Статус = q.Статус, FromDate = q.FromYear > 0 && q.FromMonth > 0 ? "1" + "-" + q.FromYear + "-" + q.FromMonth : string.Empty, ToDate = q.ToYear > 0 && q.ToMonth > 0 ? «1» + «-» + q.ToYear + «-» + q.ToMonth : string.Empty, }).К списку(), Членство = x.MembershipDetails.Select(m => новый EmployerMembershipResponse { Ид = м.Ид, EmployerId = m.EmployeeId, ИмяСотрудника = string.Concat(m.Employee.FirstName, " ", m.Employee.LastName), ProfessionalBodyId = m.ProfessionalBodyId, ProfessionalBodyName = m.ProfessionalBody.ProfessionalName, Тип Членства = m.Тип Членства, Номер Членства = m.Номер Членства, Статус Членства = m.Статус Членства, ДатаДопуска = m.ДатаДопуска, MembershipExpiryDate = m.MembershipExpiryDate, SubscriptionAmount = m.SubscriptionAmount, SubscriptionCurrencyId = m.SubscriptionCurrencyId, ИмяВалютыПодписки = m.ВалютаПодписки.ИмяВалюты, CompanyPaidAmount = m.CompanyPaidAmount, CompanyPaidCurrencyId = m.CompanyPaidCurrencyId, CompanyPaidCurrencyName = m.CompanyPaidCurrency.CurrencyName, Комментарии = m.Комментарии, AttachedDocument = string.IsNullOrEmpty(m.AttachedDocument)? string.Empty: m.AttachedDocument, Статус = м.Статус }).К списку(), EmergencyContacts = x.EmergencyDetails.Select(em => новый работодательEmergencyContactResponse { Идентификатор = em.Id, Идентификатор Сотрудника = em.ИдСотрудника, ИмяСотрудника = string.Concat(em.Employee.FirstName, " ", em.Employee.LastName), ИдентификаторТипаОтношения = em.ИдТипаОтношения, ИмяТипаОтношения = em.ТипОтношения.ИмяТипаОтношения, ПолноеИмя = em.ПолноеИмя, MobileNumber = em.MobileNumber, Электронная почта = em.Электронная почта, Адрес = em.Адрес, Статус = em.Status }).К списку(), WorkExperiences = x.ExperienceDetails.Select(wrkExp => новый EmployerWorkExperienceResponse { Идентификатор = wrkExp.Id, Идентификатор Сотрудника = wrkExp.ИдСотрудника, ИмяСотрудника = string.Concat(wrkExp.Employee.FirstName, " ", wrkExp.Employee.LastName), ИмяКомпании = wrkExp.ИмяКомпании, JoinedAs = wrkExp.JoinedAs, PositionHeld = wrkExp.PositionHeld, JoinedDate = wrkExp.JoinedDate, ResignedDate = wrkExp.ResignedDate, CurrencyId = wrkExp.CurrencyId, Валюта = wrkExp.Currency.ИмяВалюты, LastDrawnSalary = wrkExp.LastDrawnSalary, PrevoiusEpfNumber = wrkExp.PrevoiusEpfNumber, LeaveReasonId = wrkExp.LeaveReasonId, LeaveReason = wrkExp.LeaveReason.LeaveReasonName, ReasonToLeave = wrkExp.ReasonToLeave, ТипОпыта = wrkExp.ТипОпыта, Годы = wrkExp.Годы, Месяцы = wrkExp.Months, Примечания = wrkExp.Remarks, AttachedDocument = string.IsNullOrEmpty(wrkExp.AttachedDocument)? строка.Пусто: wrkExp.AttachedDocument, Статус = wrkExp.Status }).К списку(), Награды = x.AwardDetails.Where(y => y.IsAward == true).Select(awr => new EmployerAccomplishmentResponse { Идентификатор = awr.Id, ИдСотрудника = awr.ИдСотрудника, ИмяСотрудника = string.Concat(awr.Employee.FirstName, " ", awr.Employee.LastName), ИмяНаграды = awr.ИмяНаграды, Год = awr.Год, Комментарии = awr.Комментарии, IsAward = awr.IsAward, AttachedDocument = string.IsNullOrEmpty(awr.AttachedDocument)? string.Empty: awr.AttachedDocument, Статус = awr.Status }).К списку(), Стипендии = x.AwardDetails.Where(y => y.IsAward == false).Select(sch => new EmployerAccomplishmentResponse { Идентификатор = ш.Ид, Идентификатор Сотрудника = sch.ИдСотрудника, ИмяСотрудника = string.Concat(sch.Employee.FirstName, " ", sch.Employee.LastName), ИмяНаграды = имяНаграды, Год = сч.Год, Комментарии = сч.Комментарии, IsAward = sch.IsAward, AttachedDocument = string.IsNullOrEmpty(sch.AttachedDocument)? строка.Пусто: sch.AttachedDocument, Статус = схем.Статус }).К списку(), Сертификаты = x.CertificationDetails.Select(c => новый EmployerCertificationResponse { Идентификатор = c.Id, Статус = c.Статус, СертификатТипаИд = c.CertificateTypeId, Имя Сертификата = c.Имя Сертификата, DateEnd = c.DateEnd, DateStart = c.DateStart, ИмяТипа Сертификата = c.Тип Сертификата.ИмяТипа Сертификата, AttachedDocument = string.IsNullOrEmpty(c.AttachedDocument)? string.Empty: c.AttachedDocument, }).К списку() }).SingleOrDefaultAsync(cancellationToken); entity.Documents = _empDocument.GetByEmployeeId(entity.Id); если (сущность!= ноль) { если (!string.IsNullOrEmpty(entity.Personal.ImagePath)) { entity.Personal.ImagePath = GetFirstFileInDirectory(entity.Personal.ImagePath, AppSetting.DocumentUrl); } если (entity.Personal.DateOfBirth! = ноль) { entity.Personal.Age = CalculateAgeByDateOfBirth(entity.Personal.DateOfBirth); } если (entity.UserId! = ноль) { вар roleDetails = _userDetail.GetUserRoleById(entity.UserId.Value, cancelToken); если (roleDetails != ноль) { entity.Personal.RoleId = roleDetails.Item2; entity.Personal.Role = roleDetails.Item1; } } если (entity.FamilyMembers.Count() > 0) { foreach (элемент var в объекте.FamilyMembers) { if (item.DateOfBirth не равен нулю) item.Age = CalculateAgeByDateOfBirth(item.DateOfBirth); } } ProcessItemsWithAttachedDocument(entity.Health, item => item.AttachedDocument, (элемент, вложение) => item.Attachments = вложение); ProcessItemsWithAttachedDocument(entity.CriminalRecord, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocuments = вложение); ProcessItemsWithAttachedDocument(entity.Qualification, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocuments = вложение); ProcessItemsWithAttachedDocument(entity.Memberships, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocuments = вложение); ProcessItemsWithAttachedDocument(entity.WorkExperiences, элемент => элемент.ПрикрепленныйДокумент, (элемент, вложение) => элемент.Вложения = вложение); ProcessItemsWithAttachedDocument(entity.Awards, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocument = Attachment?.FirstOrDefault()); ProcessItemsWithAttachedDocument(entity.Scholarships, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocument = Attachment?.FirstOrDefault()); ProcessItemsWithAttachedDocument(entity.Certifications, item => item.AttachedDocument, (элемент, вложение) => item.AttachedDocument = Attachment?.FirstOrDefault()); ProcessItemsWithAttachedDocument(entity.Documents, item => item.AttachedDocument, (item, Attachment) => item.Attachments = Attachment); } вернуть новый GenericResponse { сообщение = _systemMessages.Success, код = HttpStatusCode.OK, результат = сущность }; } Я предоставил фрагмент кода, который нуждается в оптимизации, а также ниже представлены вспомогательные функции, используемые в этом процессе.
string GetFirstFileInDirectory(строка пути, строка documentUrl) { вар SplitPath = path.Split("/"); return FileManipulation.GetAllFilesInDirectory(splitPath[1], SplitPath[2], documentUrl)?.FirstOrDefault(); } void ProcessItemsWithAttachedDocument( Элементы IEnumerable, Func documentSelector, Action присваиваниеAction) { foreach (элемент var в items.Where(item => !string.IsNullOrEmpty(documentSelector(item)))) { var SplitPath = documentSelector(item).Split("/"); var Attachments = FileManipulation.GetAllFilesInDirectory(splitPath[1], SplitPath[2], AppSetting.DocumentUrl); присваиваниеAction(элемент, вложения); } } общедоступный статический список GetAllFilesInDirectory (строка _forFolderName, строка _directoryName, строка DocumentURL) { Файлы List = новый List(); var _directoryPath = Path.Combine(AppSetting.DocumentPath, «Документы», _forFolderName, _directoryName); если (Directory.Exists(_directoryPath)) { файлы = Directory.GetFiles(_directoryPath).ToList(); for (int i = 0; я
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение