Entity Framework LINQ查询更新空值为(!)报类型转换错误如何解决
错误原因
ForEachAsync是EF的异步迭代方法,返回值为Task类型,和你用来接收的IEnumerable<AssignementMasterData>类型不匹配,因此触发类型转换报错。- 你在迭代逻辑里使用的
Select方法仅会返回新的投影序列,不会修改原实体对象的Category字段,原有写法无法实现更新空值为(!)的需求。
解决代码
同步版本(无需修改方法签名)
using (SUPEntities db = new SUPEntities()) { // 提前加载导航属性,避免延迟加载性能问题 var masterDatas = db.AssignementMasterDatas .Include(m => m.AssignmentNoteIdentifiedClasses) .Where(m => DbFunctions.TruncateTime(m.CreatedDateTime) >= DbFunctions.TruncateTime(criteria.FilterStartDate) && DbFunctions.TruncateTime(m.CreatedDateTime) <= DbFunctions.TruncateTime(criteria.FilterEndDate) && (m.AssignmentNoteNumber == criteria.AssigmentNumber || criteria.AssignmentNumber == null) && (m.BaseCourseId == criteria.courseId || criteria.CourseId == 0) && (m.AccountNumber == criteria.AccountNumber || criteria.AccountNumber == null) && (m.ReferenceNumber == criteria.ReferenceNumber || criteria.ReferenceNumber == null) && (m.FacultyCode == criteria.FAcultyCode || criteria.FacultyCode == null) && (m.Processed == criteria.Processed) && (m.ClassNumber == criteria.ClassNumber || criteria.ClassNumber == null)) .ToList(); // 遍历修改空值字段 foreach (var master in masterDatas) { foreach (var classItem in master.AssignmentNoteIdentifiedClasses) { if (string.IsNullOrEmpty(classItem.Category)) { classItem.Category = "(!)"; } } } // 若需要将修改同步到数据库,保留此行;仅需内存修改则删除 db.SaveChanges(); }
异步版本(需要调整方法签名)
// 方法需要添加async修饰符,返回值改为Task或Task<T> public async Task YourBusinessMethod(/* 你的原有参数 */) { using (SUPEntities db = new SUPEntities()) { // 异步查询+加载导航属性 var masterDatas = await db.AssignementMasterDatas .Include(m => m.AssignmentNoteIdentifiedClasses) .Where(m => DbFunctions.TruncateTime(m.CreatedDateTime) >= DbFunctions.TruncateTime(criteria.FilterStartDate) && DbFunctions.TruncateTime(m.CreatedDateTime) <= DbFunctions.TruncateTime(criteria.FilterEndDate) && (m.AssignmentNoteNumber == criteria.AssigmentNumber || criteria.AssignmentNumber == null) && (m.BaseCourseId == criteria.courseId || criteria.CourseId == 0) && (m.AccountNumber == criteria.AccountNumber || criteria.AccountNumber == null) && (m.ReferenceNumber == criteria.ReferenceNumber || criteria.ReferenceNumber == null) && (m.FacultyCode == criteria.FAcultyCode || criteria.FacultyCode == null) && (m.Processed == criteria.Processed) && (m.ClassNumber == criteria.ClassNumber || criteria.ClassNumber == null)) .ToListAsync(); // 遍历修改空值字段 foreach (var master in masterDatas) { foreach (var classItem in master.AssignmentNoteIdentifiedClasses) { if (string.IsNullOrEmpty(classItem.Category)) { classItem.Category = "(!)"; } } } // 若需要将修改同步到数据库,保留此行;仅需内存修改则删除 await db.SaveChangesAsync(); } }
注意事项
- 检查代码中的拼写错误:你现有代码里
criteria.AssigmentNumber拼写少了一个n,和后面判断的criteria.AssignmentNumber不一致,容易触发逻辑错误。 - 若你不需要将修改同步到数据库,仅需要内存层面的字段修改,删除代码中的
SaveChanges/SaveChangesAsync调用即可。
内容的提问来源于stack exchange,提问作者user1987750
相关产品推荐
相关产品推荐

