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

C# Entity中删除空库存产品及关联空产品组的实现方案

实现删除产品后自动清理空产品组的功能

没问题,我来帮你完成这个扩展需求!咱们先梳理下逻辑:删除目标产品之后,得先拿到它所属的产品组ID,接着检查这个组里所有剩余产品的库存总和是否全为0或null,如果整个组的产品都没有库存了,就把这个产品组也一起删掉。

另外先提个小优化:你的现有代码里手动调用entities.Dispose(),不如用using语句包裹DbContext,它会自动帮你管理资源释放,更安全也更简洁。

下面是修改后的完整代码,每一步都加了注释:

public int Get(int? id)
{
    // 使用using自动管理DbContext的生命周期,避免内存泄漏
    using (JalkahoitolaEntities entities = new JalkahoitolaEntities())
    {
        // 1. 查询目标产品的库存总和
        List<int?> items = (from o in entities.Recieved_ammounts 
                            where o.ProductId == id 
                            select o.UnitStock).ToList();
        decimal? totalStock = items.Sum();

        // 2. 判断是否需要删除该产品
        if (totalStock == null || totalStock == 0)
        {
            Product productToRemove = entities.Products.FirstOrDefault(o => o.ProductId == id);
            if (productToRemove != null) // 确保产品存在
            {
                // 先记录产品所属的组ID,避免删除后拿不到
                int? groupId = productToRemove.GroupId;

                // 删除产品并保存到数据库
                entities.Products.Remove(productToRemove);
                entities.SaveChanges();

                // 3. 如果产品属于某个组,才继续检查组的状态
                if (groupId.HasValue)
                {
                    // 查询该组下所有的产品
                    var groupProducts = entities.Products.Where(o => o.GroupId == groupId.Value).ToList();

                    // 标记该组是否所有产品都无库存
                    bool isGroupEmpty = true;
                    foreach (var product in groupProducts)
                    {
                        // 计算当前产品的库存总和
                        var productStock = entities.Recieved_ammounts
                            .Where(r => r.ProductId == product.ProductId)
                            .Select(r => r.UnitStock)
                            .Sum();
                        
                        // 如果有任意一个产品库存不为0且不为null,说明组不是空的
                        if (productStock != null && productStock > 0)
                        {
                            isGroupEmpty = false;
                            break;
                        }
                    }

                    // 4. 如果组内所有产品都无库存,删除该产品组
                    if (isGroupEmpty)
                    {
                        var productGroup = entities.ProductGroups.FirstOrDefault(g => g.GroupId == groupId.Value);
                        if (productGroup != null)
                        {
                            entities.ProductGroups.Remove(productGroup);
                            entities.SaveChanges();
                        }
                    }
                }
            }
        }
    }
    return 1;
}

关键细节说明:

  • 先记录GroupId:在删除产品之前先获取它的GroupId,避免删除产品后无法关联到对应的组。
  • 双重校验:删除产品后,遍历组内所有产品,逐个计算库存总和,确保没有遗漏任何有库存的产品。
  • 空值处理:全程考虑了UnitStock、GroupId可能为null的情况,避免空引用异常。
  • 资源管理:用using替代手动Dispose,符合.NET的最佳实践。

如果你的产品组实体类名称不是ProductGroups,记得改成你实际的类名哦!

内容的提问来源于stack exchange,提问作者Firas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:32:19