You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:03:22