如何将含多条件内连接的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
相关产品推荐
相关产品推荐

