EF Core中如何用LINQ Lambda实现正确的左连接(Left Join)
EF Core中LINQ Lambda实现左连接的正确写法
你之前使用Join方法的写法本质是内连接,要实现和查询语法等价的左连接,需要用GroupJoin配合SelectMany来模拟查询语法里join...into + from...DefaultIfEmpty的逻辑,以下是正确的Lambda写法:
var query = ctx.Players .Where(b => b.PlayerId == 2706) .GroupJoin( ctx.PlayerOverrides, player => player.PlayerId, overrideData => overrideData.PlayerId, (player, overrideGroup) => new { player, overrideGroup } ) .SelectMany( group => group.overrideGroup.DefaultIfEmpty(), (group, overrideData) => new PlayerWithOverride { Player = group.player, PlayerDataOverride = overrideData } ); var res = query.FirstOrDefault(); // 子表无匹配时仍返回Player数据,PlayerDataOverride为null
逻辑说明
GroupJoin对应查询语法里的join...into grouping,它会将主表(Players)的每条记录与子表(PlayerOverrides)中匹配的记录分组关联SelectMany配合DefaultIfEmpty()对应查询语法里的from p in grouping.DefaultIfEmpty(),作用是展开每个分组,当子表无匹配项时用null填充- 最终投影成你需要的
PlayerWithOverride类型,和查询语法的执行逻辑完全一致
为什么原写法错误
你之前用的Join方法是内连接,即使给子表添加DefaultIfEmpty()也无法改变内连接的本质——只有两张表都存在匹配记录时才会返回结果,因此子表无匹配时会得到null。
内容的提问来源于stack exchange,提问作者JamesWilliams
相关产品推荐
相关产品推荐

