无法将List隐式转换为DateTime:项目日期字段填充报错求助
解决“无法将List隐式转换为DateTime”的问题
问题场景
为数据表新增LastTaskCreatedDate和LastTaskUpdatedDate字段后,编写了获取这两个字段的查询语句,并在仓储方法中新增FillLastDates方法调用该查询。但在FillLastDates方法的赋值代码处,出现报错:"Cannot implicitly convert type to System.Collections.Generic.List to System.DateTime"。
仓储方法代码:
public WebStationResponse Filter(ProjectsFilter objFilter) { try { // Taking common project ids var projectIds = _currentUser.AccessInfo.UserProjects.Select(up => up.ProjectID).ToList(); if (objFilter.ProjectID == null || objFilter.ProjectID.Count == 0) { objFilter.ProjectID = projectIds; } objFilter.ProjectID = objFilter.ProjectID.Intersect(projectIds).ToList(); objFilter.SetSqlPagingValues(); objFilter.CompanyID = _currentUser.AccessInfo.CompanyID; objFilter.UserID = _currentUser.AccessInfo.UserID; objFilter.ServerTimezone = DefaultRepository.ServerTimezoneOffset(); objFilter.UserTimezone = _currentUser.TimeZoneDetails.BaseUTCOffset; string strQuery = Project.GetProjects(objFilter); IList<ProjectDetails> lstProjectDetails = _dbContext.Database.Query<ProjectDetails>(strQuery,objFilter).ToList(); if (lstProjectDetails.Count == 0) { base.ResponseObject.ResponseId = (int)ResponseCode.RecordDoesnotExist; return base.ResponseObject; } // int intRecordCount = lstProjectDetails.Count; if(objFilter.Pagination) { intRecordCount = _dbContext.Database.ExecuteScalar<int>(Common.RecordCount()); } FillPermissions(ref lstProjectDetails); FillProjectCompetencies(ref lstProjectDetails); FillLastDates(ref lstProjectDetails); base.FillResponseDetails(null,lstProjectDetails,null); base.ResponseObject.RecordCount = intRecordCount; } catch (Exception ex) { base.FillResponseDetails(ex, null, null); } return base.ResponseObject; }
新增的FillLastDates方法代码:
private void FillLastDates(ref IList<ProjectDetails> lstProjects) { if (lstProjects == null || lstProjects.Count == 0) { return; } // var projectIds = lstProjects.Select(p => p.ProjectID).ToList(); string strQuery = Project.GetLastTaskUpdatedDates(); IList<ProjectDetails> lstDates = _dbContext.Database.Query<ProjectDetails>(strQuery, new { ProjectID = projectIds }).ToList(); // ProjectDetails objProject = null; for (int intIndex = 0; intIndex < lstProjects.Count; intIndex++) { objProject = lstProjects[intIndex]; lstProjects[intIndex].LastTaskCreated = lstDates.Where(c => c.ProjectID == objProject.ProjectID).ToList(); lstProjects[intIndex].LastTaskUpdated= lstDates.Where(c =>c.ProjectID == objProject.ProjectID).ToList(); } }
错误原因
ProjectDetails类中的LastTaskCreated和LastTaskUpdated字段是DateTime(或可空DateTime?)类型,但代码中使用lstDates.Where(...).ToList()返回的是List<ProjectDetails>集合,直接将集合赋值给单个DateTime类型的字段,导致类型不匹配。
解决方案
步骤1:优化查询结果的查找效率
将查询得到的lstDates转换为字典,以ProjectID为键,这样后续查找时无需循环遍历,提升性能:
var dateLookup = lstDates.ToDictionary(d => d.ProjectID, d => new { d.LastTaskCreated, d.LastTaskUpdated });
步骤2:修正字段赋值逻辑
在循环中通过字典快速匹配对应项目的日期数据,并将单个DateTime值赋值给目标字段:
private void FillLastDates(ref IList<ProjectDetails> lstProjects) { if (lstProjects == null || lstProjects.Count == 0) { return; } var projectIds = lstProjects.Select(p => p.ProjectID).ToList(); string strQuery = Project.GetLastTaskUpdatedDates(); IList<ProjectDetails> lstDates = _dbContext.Database.Query<ProjectDetails>(strQuery, new { ProjectID = projectIds }).ToList(); // 将日期列表转为字典,按ProjectID索引 var dateLookup = lstDates.ToDictionary(d => d.ProjectID, d => new { d.LastTaskCreated, d.LastTaskUpdated }); for (int intIndex = 0; intIndex < lstProjects.Count; intIndex++) { var objProject = lstProjects[intIndex]; if (dateLookup.TryGetValue(objProject.ProjectID, out var dateInfo)) { // 赋值单个DateTime值 lstProjects[intIndex].LastTaskCreated = dateInfo.LastTaskCreated; lstProjects[intIndex].LastTaskUpdated = dateInfo.LastTaskUpdated; } else { // 若无匹配数据,可设置默认值(根据业务需求调整) lstProjects[intIndex].LastTaskCreated = null; lstProjects[intIndex].LastTaskUpdated = null; } } }
额外说明
确保Project.GetLastTaskUpdatedDates()返回的SQL查询,每个ProjectID对应唯一一条记录,且包含正确的LastTaskCreated和LastTaskUpdated日期字段值,这样字典转换和赋值才能正确生效。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

