LINQ查询返回Null问题排查:ViewModel赋值与项目金额计算
问题排查与修复方案
嘿,我来帮你搞定这个返回null的问题!你的LINQ查询之所以返回空值,核心原因大概率是:当这个项目还没有进行过任何金额分配时,db.Mappeds表中根本没有对应ProjectId的记录,导致Where(p => p.ProjectId == ProjectId)过滤后得到的是空集合,后续的ToList().LastOrDefault()自然就返回null了。
为什么会出现这种情况?
你当前的查询逻辑是从已有的分配记录(Mappeds)里关联项目信息,但如果是第一次给这个项目分配金额,Mappeds里完全没有相关数据,查询结果肯定是空的呀。
直接有效的修复方案
我们换个思路:直接从ProjectModels表获取项目的基础信息,不需要依赖Mappeds的记录,这样哪怕没有任何分配历史,也能拿到项目的总金额等数据,再结合你计算好的剩余金额all来构建ViewModel就好了。
修改后的代码如下:
public ActionResult Create(int? ProjectId) { // 先校验ProjectId是否有效 if (!ProjectId.HasValue) { return BadRequest("项目ID不能为空"); } // 省略其他代码... // 直接从项目表获取目标项目信息 var targetProject = db.Projects.FirstOrDefault(p => p.ProjectId == ProjectId); if (targetProject == null) { // 项目不存在的情况,返回NotFound或者自定义提示 return NotFound("未找到指定项目"); } // 构建ViewModel,不需要依赖Mappeds的记录 var result = new MappedViewModels() { ProjectId = targetProject.ProjectId, ProjectName = targetProject.ProjectName, ProjectAllocatedAmount = targetProject.Amount, RemainingAmount = targetProject.Amount - all, // 初始化其他必填字段的默认值 SchoolName = "", MappedAmount = 0, MappedType = 0, MappedDate = "", SchoolId = 0 }; return View(result); }
额外的优化小建议
- 整合剩余金额计算逻辑:如果
all是该项目已分配的总金额,建议直接在代码中计算,不用单独维护all变量,逻辑更可靠:// 计算该项目已分配的总金额 var totalAllocated = db.Mappeds.Where(p => p.ProjectId == ProjectId).Sum(p => p.MappedAmount); // 剩余金额直接用项目总金额减去已分配金额 var remainingAmount = targetProject.Amount - totalAllocated; - 移除不必要的
Include和LastOrDefault():在创建新分配的场景下,我们不需要已有的分配记录,直接从项目表取数据就足够了,原查询里的Include(p => p.Project)和LastOrDefault()其实是多余的,反而会导致无数据时返回null的问题。
内容的提问来源于stack exchange,提问作者nischalinn
相关产品推荐
相关产品推荐

