From fbc995571530ada6530c848123722249ca07442c Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Fri, 4 Nov 2022 16:16:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BD=B1=E5=93=8D=E4=B8=8A=E4=BC=A0=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Helper/ExcelExportHelper.cs | 14 ++- .../IRaCIS.Core.Application.xml | 16 ++++ .../Service/Allocation/VisitTaskService.cs | 2 +- .../Service/QC/DTO/QCListViewModel.cs | 86 +++++++++++++++++-- .../Service/QC/QCListService.cs | 59 ++++++++++--- .../Service/QC/_MapConfig.cs | 46 ++++++---- .../TrialSiteUser/DTO/UserTrialViewModel.cs | 15 ++-- IRaCIS.Core.Domain/_Config/_StaticData.cs | 2 + .../_IRaCIS/ObjectExtension.cs | 11 +++ 9 files changed, 206 insertions(+), 45 deletions(-) diff --git a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs index da69b4dc2..eda03b99e 100644 --- a/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs +++ b/IRaCIS.Core.Application/Helper/ExcelExportHelper.cs @@ -3,6 +3,7 @@ using IRaCIS.Core.Application.Helper; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using MiniExcelLibs; +using MiniExcelLibs.OpenXml; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -25,10 +26,10 @@ public static class ExcelExportHelper //字典表查询出所有需要翻译的数据 - var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).ToArray()); + var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).Distinct().ToArray()); - var dic = JsonConvert.DeserializeObject>(data.ToJsonStr()); + var dic = JsonConvert.DeserializeObject>(data.ToJsonNotIgnoreNull()); foreach (var key in dic.Keys) { @@ -41,7 +42,7 @@ public static class ExcelExportHelper foreach (var item in dic[key] as JArray) { - var itemDic = JsonConvert.DeserializeObject>(item.ToJsonStr()); + var itemDic = JsonConvert.DeserializeObject>(item.ToJsonNotIgnoreNull()); foreach (var needTranslateProperty in needTranslatePropertyList) @@ -80,7 +81,12 @@ public static class ExcelExportHelper var memoryStream = new MemoryStream(); - await MiniExcel.SaveAsByTemplateAsync(memoryStream, tplPath, data); + var config = new OpenXmlConfiguration() + { + IgnoreTemplateParameterMissing = true, + }; + + await MiniExcel.SaveAsByTemplateAsync(memoryStream, tplPath, data, config); memoryStream.Seek(0, SeekOrigin.Begin); diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 8e2608bab..3f0593e11 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -6925,6 +6925,22 @@ + + + 影像上传列表 只导出已上传状态的访视记录 + + + + + + + + + 质疑列表 + + + + CRC 访视上传列表 diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index b67a773d4..a5593b1a9 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -102,7 +102,7 @@ namespace IRaCIS.Core.Application.Service.Allocation - var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == querySubjectAssign.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType }).FirstOrDefaultAsync()).IfNullThrowException(); + var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == querySubjectAssign.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder, x.ReadingType,x.IsArbitrationReading,x.IsOncologyReading }).FirstOrDefaultAsync()).IfNullThrowException(); return (pageList, criterionConfig); } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index ed1d933fa..2a3e1d9bb 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -55,7 +55,7 @@ namespace IRaCIS.Core.Application.Contracts public Guid TrialId { get; set; } - public Guid[] SubjectVisitIds { get; set; }=new Guid[0]; + public Guid[] SubjectVisitIds { get; set; } = new Guid[0]; } @@ -120,7 +120,9 @@ namespace IRaCIS.Core.Application.Contracts public class CRCVisitExportDTO { - public ChallengeStateEnum ChallengeState { get; set; } + public ChallengeStateEnum ChallengeState { get; set; } + + [DictionaryTranslateAttribute("YesOrNo")] public bool IsUrgent { get; set; } public string BlindName { get; set; } = String.Empty; public string VisitName { get; set; } = string.Empty; @@ -134,7 +136,7 @@ namespace IRaCIS.Core.Application.Contracts public DateTime? SubmitTime { get; set; } - + [DictionaryTranslateAttribute("SubmitState")] public SubmitStateEnum SubmitState { get; set; } @@ -149,6 +151,78 @@ namespace IRaCIS.Core.Application.Contracts } + public class QCChanllengeExportDto + { + + [DictionaryTranslateAttribute("Subject_Visit_Status")] + public SubjectStatus SubjectState { get; set; } + + public string ChallengeCode { get; set; } = String.Empty; + + public String TrialSiteCode { get; set; } = String.Empty; + + public string SubjectCode { get; set; } = String.Empty; + + public string VisitName { get; set; } = string.Empty; + + + public DateTime? CreateTime { get; set; } + + + public string CreateUserName { get; set; } = String.Empty; + + + + public DateTime? LatestMsgTime { get; set; } + + + public string LatestReplyUserName { get; set; } = String.Empty; + + public string Content { get; set; } = string.Empty; + + [DictionaryTranslateAttribute("YesOrNo")] + public bool IsClosed { get; set; } + + public DateTime? ClosedTime { get; set; } + + public DateTime? DeadlineTime { get; set; } + + [DictionaryTranslateAttribute("YesOrNo")] + public bool IsOverTime => IsClosed ? ClosedTime > DeadlineTime : DateTime.Now > DeadlineTime; + + public string ChallengeDuration + { + get + { + if (!ClosedTime.HasValue) + return ""; + else return string.Format("{0}天{1}小时{2}分钟", (ClosedTime - CreateTime)?.Days, (ClosedTime - CreateTime)?.Hours, (ClosedTime - CreateTime)?.Minutes); + } + } + + + //public QCChanllengeReuploadEnum ReuploadEnum { get; set; } + //public SubmitStateEnum SubmitState { get; set; } + //public string? CurrentActionUserName { get; set; } + + //public bool IsUrgent { get; set; } + + //public DateTime? ReUploadedTime { get; set; } + + //public RequestBackStateEnum RequestBackState { get; set; } + + //public string PreliminaryAuditUserName { get; set; } = String.Empty; + //public AuditStateEnum AuditState { get; set; } + //public CurrentQC CurrentQCEnum { get; set; } + //public string ChallengeType { get; set; } = string.Empty; + //public string Note { get; set; } = string.Empty; + + + + } + + + public class QCCRCVisitViewModel : QCVisitBasicListViewModel { @@ -174,7 +248,7 @@ namespace IRaCIS.Core.Application.Contracts public bool IsHaveClinicalData { get; set; } - public string MedicalNo { get; set; } + public string MedicalNo { get; set; } public int? Age { get; set; } public string Sex { get; set; } = string.Empty; @@ -386,9 +460,9 @@ namespace IRaCIS.Core.Application.Contracts public class CheckDialogDTO { - public QCCheckViewModel SubjectVisitCheck { get; set; } + public QCCheckViewModel SubjectVisitCheck { get; set; } - public List DialogList { get; set; } + public List DialogList { get; set; } } public class QCCheckViewModel diff --git a/IRaCIS.Core.Application/Service/QC/QCListService.cs b/IRaCIS.Core.Application/Service/QC/QCListService.cs index b7a0e8bf7..d12359664 100644 --- a/IRaCIS.Core.Application/Service/QC/QCListService.cs +++ b/IRaCIS.Core.Application/Service/QC/QCListService.cs @@ -41,7 +41,13 @@ namespace IRaCIS.Core.Application.Image.QA #region 导表查询 - //影像上传列表 + /// + /// 影像上传列表 只导出已上传状态的访视记录 + /// + /// + /// + /// + /// [HttpPost] [AllowAnonymous] public async Task CRCVisitListExport(CRCVisitSearchDTO visitSearchDTO, @@ -49,7 +55,6 @@ namespace IRaCIS.Core.Application.Image.QA [FromServices] IDictionaryService _dictionaryService) { - var svExpression = QCCommon.GetSubjectVisitFilter(visitSearchDTO.VisitPlanArray); var list = await _subjectVisitRepository.Where(x => x.TrialId == visitSearchDTO.TrialId) @@ -67,24 +72,54 @@ namespace IRaCIS.Core.Application.Image.QA .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); - //var needTranslatePropertyList = typeof(CRCVisitExportDTO).GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), false)) - // .Select(c => new { c.Name, DicParentCode = ((DictionaryTranslateAttribute?)c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false)[0])?.DicParentCode }).ToList() - // ; + var exportInfo = (await _trialRepository.Where(t => t.Id == visitSearchDTO.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - //var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).ToArray()); - - //var obj = new { cc = "aa", list }; + exportInfo.List = list; - var exportInfo = (await _trialRepository.Where(t => t.Id == visitSearchDTO.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); + + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, exportInfo, "", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO)); + + } - dynamic obj = exportInfo; - ((IDictionary)obj).Add("List", list); - return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialCRCUploadImageList_Export, obj, "", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO)); + /// + /// 质疑列表 + /// + /// + /// + [HttpPost] + [AllowAnonymous] + public async Task GetQCChallengeList_EXport(ChallengeQuery challengeQuery, + [FromServices] IRepository _commonDocumentRepository, + [FromServices] IDictionaryService _dictionaryService) + + { + var svExpression = QCCommon.GetQCChallengeFilter(challengeQuery.VisitPlanArray); + + var list =await _repository.Where(x => x.TrialId == challengeQuery.TrialId) + //.WhereIf(challengeQuery.ChallengeState != null, t => t.SubjectVisit.ChallengeState == challengeQuery.ChallengeState) + .WhereIf(challengeQuery.ReuploadEnum != null, t => t.ReuploadEnum == challengeQuery.ReuploadEnum) + .WhereIf(challengeQuery.IsClosed != null, t => t.IsClosed == challengeQuery.IsClosed) + .WhereIf(challengeQuery.SiteId != null, t => t.SubjectVisit.SiteId == challengeQuery.SiteId) + .WhereIf(challengeQuery.SubjectId != null, t => t.SubjectVisit.SubjectId == challengeQuery.SubjectId) + .WhereIf(challengeQuery.CreateUserId != null, t => t.CreateUserId == challengeQuery.CreateUserId) + .WhereIf(!string.IsNullOrEmpty(challengeQuery.SubjectCode), t => t.SubjectVisit.Subject.Code.Contains(challengeQuery.SubjectCode)) + .WhereIf(challengeQuery.VisitPlanArray != null && challengeQuery.VisitPlanArray?.Length > 0, svExpression) + //.WhereIf(!string.IsNullOrEmpty(challengeQuery.VisitPlanInfo), challengeQuery.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.InPlan == false : t => t.SubjectVisit.VisitNum == decimal.Parse(challengeQuery.VisitPlanInfo)) + .WhereIf(challengeQuery.IsUrgent != null, t => t.SubjectVisit.IsUrgent == challengeQuery.IsUrgent) + .WhereIf(challengeQuery.IsOverTime != null, t => DateTime.Now > t.DeadlineTime) + .ProjectTo(_mapper.ConfigurationProvider).ToListAsync(); + + + var exportInfo = (await _trialRepository.Where(t => t.Id == challengeQuery.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); + + exportInfo.List = list; + + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialQCImageChanllengeList_Export, exportInfo, "", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(CRCVisitExportDTO)); } diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index 951b145b0..0a407e267 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -1,5 +1,6 @@ using AutoMapper; using AutoMapper.EquivalencyExpression; +using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts.DTO; using IRaCIS.Core.Application.MediatR.CommandAndQueries; @@ -13,17 +14,28 @@ namespace IRaCIS.Core.Application.Service #region 导出列表 - - CreateMap() - .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)) - .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) - .ForMember(d => d.SubmitUserName, u => u.MapFrom(s => s.SubmitUser.FullName)) - - .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.IsBaseLine ? t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() - || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count() > 0) - || t.PreviousSurgeryList.Any() : false)); + CreateMap(); + CreateMap() + .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode)) + .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.Subject.Code)) + .ForMember(d => d.SubmitUserName, u => u.MapFrom(s => s.SubmitUser.FullName)) + .ForMember(d => d.IsHaveClinicalData, u => u.MapFrom(t => t.IsBaseLine ? t.PreviousHistoryList.Any() || t.PreviousOtherList.Any() + || t.ReadingClinicalDataList.Any(x => x.ClinicalDataTrialSet.UploadRole == Domain.Share.UploadRole.CRC && x.ReadingClinicalDataPDFList.Count() > 0) + || t.PreviousSurgeryList.Any() : false)); + + + + CreateMap() + + .ForMember(d => d.SubjectCode, u => u.MapFrom(s => s.SubjectVisit.Subject.Code)) + .ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.SubjectVisit.TrialSite.TrialSiteCode)) + .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)) + + .ForMember(d => d.CreateUserName, u => u.MapFrom(s => s.CreateUser.UserName)) + .ForMember(d => d.LatestReplyUserName, u => u.MapFrom(t => t.LatestReplyUser.UserName)) + .ForMember(d => d.SubjectState, u => u.MapFrom(s => s.SubjectVisit.Subject.Status)); #endregion @@ -85,7 +97,7 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(d => d.ParentShowOrder, u => u.MapFrom(s => s.ParentQuestion.ShowOrder)) - .ForMember(d => d.ParentQuestionName, u => u.MapFrom(s => s.ParentQuestion.QuestionName)); + .ForMember(d => d.ParentQuestionName, u => u.MapFrom(s => s.ParentQuestion.QuestionName)); CreateMap(); @@ -119,7 +131,7 @@ namespace IRaCIS.Core.Application.Service CreateMap(); CreateMap() .ForMember(d => d.IsUploadedImage, u => u.MapFrom(s => s.StudyList.Count() > 0 || s.NoneDicomStudyList.SelectMany(u => u.NoneDicomFileList).Count() > 0)); - + CreateMap() .ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path + "?access_token=" + token)); @@ -249,18 +261,18 @@ namespace IRaCIS.Core.Application.Service // 一致性核查文件 CreateMap() - .ForMember(d => d.CreateUserName, u => u.MapFrom(t => t.User.FirstName +"/"+ t.User.LastName)); - + .ForMember(d => d.CreateUserName, u => u.MapFrom(t => t.User.FirstName + "/" + t.User.LastName)); + //CRC 质疑列表 CreateMap() .ForMember(d => d.PreliminaryAuditUserName, u => u.MapFrom(s => s.SubjectVisit.PreliminaryAuditUser.UserName)) .ForMember(d => d.PreliminaryAuditUserId, u => u.MapFrom(s => s.SubjectVisit.PreliminaryAuditUserId)) .ForMember(d => d.CurrentActionUserId, u => u.MapFrom(s => s.SubjectVisit.CurrentActionUserId)) - .ForMember(d => d.CurrentActionUserName, u => u.MapFrom(s => s.SubjectVisit .CurrentActionUser.UserName)) + .ForMember(d => d.CurrentActionUserName, u => u.MapFrom(s => s.SubjectVisit.CurrentActionUser.UserName)) .ForMember(d => d.SubmitState, u => u.MapFrom(s => s.SubjectVisit.SubmitState)) - + .ForMember(d => d.SiteId, u => u.MapFrom(s => s.SubjectVisit.SiteId)) .ForMember(d => d.AuditState, u => u.MapFrom(s => s.SubjectVisit.AuditState)) .ForMember(d => d.IsUrgent, u => u.MapFrom(s => s.SubjectVisit.IsUrgent)) @@ -277,7 +289,7 @@ namespace IRaCIS.Core.Application.Service .ForMember(d => d.CreateUserName, u => u.MapFrom(s => s.CreateUser.UserName)) .ForMember(d => d.LatestReplyUserName, u => u.MapFrom(t => t.LatestReplyUser.UserName)) .ForMember(d => d.ChallengeCode, u => u.MapFrom(s => s.ChallengeCode)); //排序的时候有坑 把这个带到sql 中去了 - //.AfterMap((src, dest) => dest.ChallengeCode = "Q" + src.ChallengeCode.ToString("D5"));//实测没有效果 + //.AfterMap((src, dest) => dest.ChallengeCode = "Q" + src.ChallengeCode.ToString("D5"));//实测没有效果 @@ -314,5 +326,5 @@ namespace IRaCIS.Core.Application.Service } } - + } diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs index 18e3801a9..e3bd78cbe 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/DTO/UserTrialViewModel.cs @@ -104,25 +104,30 @@ namespace IRaCIS.Application.Contracts } - public class TrialCRCUploadImageList_Export: ExcelExportTrialInfo + public class TrialCRCUploadImageList_Export: ExcelExportInfo { + + } - public class ExcelExportTrialInfo : TrialSelectDTO + public class ExcelExportInfo : TrialSelectDTO { public DateTime CurrentTime { get; set; } = DateTime.Now; + + public object List { get; set; } + } - public class TrialUserExportDTO : ExcelExportTrialInfo + public class TrialUserExportDTO : ExcelExportInfo { public List TrialUserList { get; set; } = new List(); } - public class TrialSiteUserExportDto : ExcelExportTrialInfo + public class TrialSiteUserExportDto : ExcelExportInfo { public List TrialSiteUserList { get; set; } = new List(); @@ -136,7 +141,7 @@ namespace IRaCIS.Application.Contracts public string TrialSiteAliasName { get; set; } = String.Empty; } - public class TrialSiteUserSummaryExportDto : ExcelExportTrialInfo + public class TrialSiteUserSummaryExportDto : ExcelExportInfo { public List TrialSiteUserList { get; set; } = new List(); diff --git a/IRaCIS.Core.Domain/_Config/_StaticData.cs b/IRaCIS.Core.Domain/_Config/_StaticData.cs index 6fe383cb0..2ed77b7c1 100644 --- a/IRaCIS.Core.Domain/_Config/_StaticData.cs +++ b/IRaCIS.Core.Domain/_Config/_StaticData.cs @@ -124,6 +124,8 @@ public static class StaticData public const string TrialUserList_Export = "TrialUserList_Export"; public const string TrialCRCUploadImageList_Export = "TrialCRCUploadImageList_Export"; + + public const string TrialQCImageChanllengeList_Export = "TrialQCImageChanllengeList_Export"; } diff --git a/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs b/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs index 23525f517..adfc82153 100644 --- a/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs +++ b/IRaCIS.Core.Infrastructure/_IRaCIS/ObjectExtension.cs @@ -29,5 +29,16 @@ namespace IRaCIS.Core.Infrastructure.Extention return JsonConvert.SerializeObject(obj, new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd HH:mm:ss", ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }); } + + /// + /// 将对象序列化成稽查需要的Json字符串 + /// + /// + /// + public static string ToJsonNotIgnoreNull(this object obj) + { + + return JsonConvert.SerializeObject(obj, new JsonSerializerSettings { DateFormatString = "yyyy-MM-dd HH:mm:ss", ReferenceLoopHandling = ReferenceLoopHandling.Ignore, NullValueHandling = NullValueHandling.Include }); + } } }