将含OR条件LEFT JOIN的SQL查询转换为等效LINQ语句的咨询
LINQ实现带OR条件的左外连接方案
LINQ原生join语法仅支持等值匹配,无法直接在关联条件中编写OR逻辑,要实现你SQL中T_Battalions的OR条件左外连接,需要将标准join写法替换为「直接遍历+条件筛选+DefaultIfEmpty」的组合写法,修改后的完整代码如下:
from fighter in T_Fighters join fighterEnlistment in T_FighterEnlistments on fighter.FighterId equals fighterEnlistment.FighterId into fighterEnlistments from subFighterEnlistments in fighterEnlistments.Where(x => !x.WolfError).DefaultIfEmpty() join soldierTransfer in T_FighterTransfers on fighter.FighterId equals soldierTransfer.FighterId into soldierTransfers from subsoldierTransfers in soldierTransfers.Where(x=>!x.WolfError).DefaultIfEmpty() // 核心改动:替换原T_Battalions的join逻辑,实现OR条件左外连接 from battalion in T_Battalions.Where(b => b.BattalionId == subFighterEnlistments.BattalionId || b.BattalionId == subsoldierTransfers.BattalionId).DefaultIfEmpty() // 注意你原有代码此处表名与SQL不一致,已修正为SQL中的T_BattalionSideServed,按需调整即可 join battalionsSideServed in T_BattalionSideServed on battalion.BattalionSideServedId equals battalionsSideServed.BattalionSideServedId into battalionsSideServeds from subbattalionsSideServeds in battalionsSideServeds.DefaultIfEmpty() // 按需补充select逻辑返回对应字段 select new { FighterInfo = fighter, EnlistmentInfo = subFighterEnlistments, TransferInfo = subsoldierTransfers, BattalionInfo = battalion, SideServedInfo = subbattalionsSideServeds }
改动说明
原SQL的OR关联左外连接等效于:在拿到前两个关联表的结果后,从T_Battalions中筛选满足任意一个ID匹配的记录,没有匹配则返回空,上述写法在EF/EF Core中可以正确转换为和你给出的SQL完全等效的执行语句,不会产生本地计算的性能问题。
内容的提问来源于stack exchange,提问作者Kaushik Thanki
相关产品推荐
相关产品推荐

