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

如何将含多条件内连接的SQL转换为Lambda LINQ表达式?

多条件内连接SQL转Lambda LINQ表达式实现

原SQL语句

SELECT L.LotNo,
    L.ProcessCode,
    L.ProcessName,
    L.MachineNo,
    M.MaterialLotNo,
    M.MaterialName,
    M.StartTime,
    M.EndTime
  FROM LotProgress L
  INNER JOIN MaterialMount M
  ON (M.MachineNo = L.MachineNo OR M.MachineNo = 
    (SELECT ParentMachineNo FROM Machine WHERE MachineNo = L.MachineNo))
  AND (L.StartTime <= M.EndTime OR M.EndTime IS NULL) 
  AND (L.EndTime >= M.StartTime OR L.EndTime IS NULL)

已编写的C#代码(未完成多条件连接)

var vewMaterialTrace = viewLotProgress
    .Join(viewMaterialMount, a => a.MachineNo, b => b.MachineNo, 
    (a, b) => new viewMaterial
    {
        LotNo = a.LotNo,
        ProcessCode = a.ProcessCode,
        ProcessName = a.ProcessName,
        MachineNo = a.MachineNo,
        OpeGroupCode = b.OpeGroupCode,
        OpeGroupName = b.OpeGroupName,
        MaterialLotNo = b.MaterialLotNo,
        MaterialName = b.MaterialName,
        StartTime = b.StartTime,
        EndTime = b.EndTime,
      }).ToList();

修正后的Lambda LINQ代码

原SQL的连接条件包含OR和多组AND逻辑,直接用Join的键匹配重载无法满足,改用SelectMany配合Where模拟内连接逻辑,完全贴合原SQL的条件:

// 假设存在Machine集合/可查询对象,用于获取父机器号
var machineQuery = ...; // 示例:_dbContext.Machine

var vewMaterialTrace = viewLotProgress
    .SelectMany(lot => viewMaterialMount, (lot, material) => new { lot, material })
    .Where(pair => 
        // 机器号匹配逻辑:当前机器号相等 或 匹配对应父机器号
        (pair.material.MachineNo == pair.lot.MachineNo || 
         pair.material.MachineNo == machineQuery.FirstOrDefault(m => m.MachineNo == pair.lot.MachineNo)?.ParentMachineNo)
        // 时间条件1:工单开始时间<=物料结束时间,或物料结束时间为空
        && (pair.lot.StartTime <= pair.material.EndTime || pair.material.EndTime == null)
        // 时间条件2:工单结束时间>=物料开始时间,或工单结束时间为空
        && (pair.lot.EndTime >= pair.material.StartTime || pair.lot.EndTime == null)
    )
    .Select(pair => new viewMaterial
    {
        LotNo = pair.lot.LotNo,
        ProcessCode = pair.lot.ProcessCode,
        ProcessName = pair.lot.ProcessName,
        MachineNo = pair.lot.MachineNo,
        OpeGroupCode = pair.material.OpeGroupCode,
        OpeGroupName = pair.material.OpeGroupName,
        MaterialLotNo = pair.material.MaterialLotNo,
        MaterialName = pair.material.MaterialName,
        StartTime = pair.material.StartTime,
        EndTime = pair.material.EndTime,
    })
    .ToList();

逻辑说明

  • SelectMany生成两个集合的笛卡尔积,作为内连接的基础匹配范围
  • Where块完整复现原SQL的三个连接条件,包含OR分支和空值判断
  • 最终通过Select将匹配结果投影到目标实体viewMaterial

如果是EF Core等ORM场景,FirstOrDefault会自动生成对应的子查询,和原SQL的执行逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:40:34