ASP.NET MVC C#中EF模型如何替代FirstOrDefault获取全部结果
解决方案:批量处理工单关联的产品库存修改问题
你的核心问题是仅处理了单条ProductOrder记录,要实现批量处理,需要遍历该工单下所有关联的ProductOrder,逐个计算库存调整值并更新对应产品的记录。以下是修改后的代码及说明:
修改后的完整代码
public ActionResult DeleteConfirmed(int id) { // 获取要删除的工单 WorkOrders workOrders = db.WorkOrders.Find(id); // 获取该工单下所有关联的ProductOrder记录,转为List避免重复查询 var productOrders = db.ProductOrders.Where(p => p.OrderID == id).ToList(); // 遍历每个关联的ProductOrder记录 foreach (var productOrder in productOrders) { // 空值判断,避免空引用异常 if (!productOrder.Qty_Ordered.HasValue || !productOrder.Qty_Returned.HasValue || !productOrder.Qty_Available.HasValue || !productOrder.Qty_On_Hold.HasValue) { continue; // 跳过字段不完整的记录,或根据业务需求做其他处理 } // 计算库存调整差值 var diff = productOrder.Qty_Ordered.Value - productOrder.Qty_Returned.Value; var newAvailable = productOrder.Qty_Available.Value + diff; var newHold = productOrder.Qty_On_Hold.Value - diff; // 获取当前ProductID对应的所有ProductOrder记录并批量更新 var targetProducts = db.ProductOrders.Where(x => x.ProductID == productOrder.ProductID).ToList(); foreach (var item in targetProducts) { item.Qty_Available = newAvailable; item.Qty_On_Hold = newHold; db.Entry(item).State = EntityState.Modified; } } // 统一提交所有库存修改 db.SaveChanges(); // 删除该工单下所有关联的ProductOrder记录 db.ProductOrders.RemoveRange(productOrders); // 删除工单 db.WorkOrders.Remove(workOrders); // 提交删除操作 db.SaveChanges(); return RedirectToAction("ViewOrders"); }
关键改动说明
- 替换FirstOrDefault为集合遍历:去掉
FirstOrDefault(),改为遍历productOrders列表,确保处理该工单下的每一条ProductOrder记录。 - 提前加载关联记录:用
.ToList()将IQueryable转为内存集合,避免EF多次向数据库发起查询,提升执行效率。 - 调整SaveChanges位置:把
db.SaveChanges()从内层循环移到外层,批量提交修改,减少数据库交互次数。 - 增加空值判断:针对可能为null的数值字段添加校验,避免运行时出现空引用异常。
- 优化变量命名:将
available改为newAvailable、hold改为newHold,提升代码可读性。
额外优化建议
如果你的业务逻辑中,ProductOrders表的ProductID对应Product表的主键,更合理的做法是直接更新Product表的库存字段,而非修改ProductOrders中的记录——这样可以避免同一产品的多条ProductOrder被重复修改,也更符合库存管理的常规逻辑。
内容的提问来源于stack exchange,提问作者Kip M.
相关产品推荐
相关产品推荐

