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

EF Core查询如何包含无扫描纸箱的订单规则数据?

解决EF Core查询包含无扫描纸箱的销售订单规则问题

你需要从SaleOrderRules表(指定订单的规则)开始查询,通过左外连接或子查询关联对应的Cartons数据,这样就能保留所有规则——哪怕该规则下还没有扫描的纸箱。以下是两种可行的实现方式:

方式1:LINQ查询语法(左外连接)

这种写法和你原有的查询风格一致,通过左连接确保所有规则都被包含:

var saleOrderCartonCountBreakdown = await
    (from sor in _context.SaleOrderRules
     // 只查询目标订单的规则
     where sor.SaleOrderId == id
     // 关联产品编码表获取产品值
     join pc in _context.ProductCodes on sor.ProductCodeId equals pc.ProductCodeId
     // 左连接目标订单下对应产品编码的纸箱数据
     join c in _context.Cartons on new { sor.ProductCodeId, SaleOrderId = id } equals new { c.ProductCodeId, c.SaleOrderId } into cartonGroup
     // 左连接核心:没有匹配纸箱时返回null,确保规则不被过滤
     from carton in cartonGroup.DefaultIfEmpty()
     // 按规则的唯一标识、需求数量、产品编码分组
     group carton by new 
     {
         sor.SaleOrderRuleId,
         sor.Quantity,
         pc.Value
     } into g
     select new SaleOrderCartonBreakdownModel
     {
         SaleOrderRuleId = g.Key.SaleOrderRuleId,
         ProductCode = g.Key.Value,
         TotalRequired = g.Key.Quantity,
         // 统计非null的纸箱数量(即已扫描数量)
         TotalScanned = g.Count(c => c != null),
         // 筛选非null的纸箱生成列表,无纸箱时返回空列表
         CartonList = g.Where(c => c != null)
                       .Select(c => new SaleOrderCartonBreakdownCarton 
                       { 
                           CartonId = c.CartonId, 
                           BoxID = c.BoxID 
                       }).ToList()
     }).ToListAsync();

方式2:子查询写法(更简洁,适合新手)

不需要复杂的连接,直接为每个规则查询对应的纸箱统计和列表:

var saleOrderCartonCountBreakdown = await _context.SaleOrderRules
    .Where(sor => sor.SaleOrderId == id)
    .Select(sor => new SaleOrderCartonBreakdownModel
    {
        SaleOrderRuleId = sor.SaleOrderRuleId,
        ProductCode = sor.ProductCode.Value,
        TotalRequired = sor.Quantity,
        // 子查询统计该规则对应已扫描的纸箱数量
        TotalScanned = _context.Cartons.Count(c => c.SaleOrderId == id && c.ProductCodeId == sor.ProductCodeId),
        // 子查询获取该规则对应的纸箱列表
        CartonList = _context.Cartons
            .Where(c => c.SaleOrderId == id && c.ProductCodeId == sor.ProductCodeId)
            .Select(c => new SaleOrderCartonBreakdownCarton
            {
                CartonId = c.CartonId,
                BoxID = c.BoxID
            }).ToList()
    })
    .ToListAsync();

问题根源说明

你原来的查询从Cartons表开始,只有存在扫描纸箱的产品编码才会进入后续的关联逻辑,自然会丢失没有纸箱的规则。而从SaleOrderRules出发,无论是左连接还是子查询,都能确保所有目标订单的规则被保留,无纸箱时统计数为0、列表为空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:48:24