Linq 查询到 Linq lambda EF Core Join

问题描述 投票:0回答:1

我正在尝试使用 Linq Lambda 在 EF Core 中进行左连接。

我找到了我需要的可以 Linq 查询格式工作的代码,但我更喜欢使用 Lambda 而不是查询。

public class PlayerWithOverride
{
    public Player Player { get; set; }
    public PlayerOverride PlayerDataOverride{ get; set; }

}
var query = from b in ctx.Players
            join p in ctx.PlayerOverrides
            on b.PlayerId equals p.PlayerId into grouping
            from p in grouping.DefaultIfEmpty() where b.PlayerId == 2706
             select new PlayerWithOverride() { Player = b, PlayerDataOverride= p };

var res = query.FirstOrDefault(); // Correctly return a row even when there is no match in sub table. 

以上工作正常。它将返回一个玩家,如果

PlayerOverrides
表中有匹配的覆盖,它会将其添加到
PlayerDataWithOverride
,如果没有,
PlayerDataWithOverride
将是
null
。所以它正在执行左连接。

var test = ctx.Players.Where(o => o.PlayerId == 2706).Join(
    ctx.PlayerOverrides.DefaultIfEmpty(),
    p => p.PlayerId,
    e => e.PlayerId,
    (p, e) => new PlayerWithOverride()
    {
        Player = p,
        PlayerDataOverride = e

     });

var pl = test.FirstOrDefault(); // null when both rows don't match

当尝试在 Lambda(上面)中执行相同的操作时,它会执行内部联接,导致它仅在两个表都有结果时才返回任何内容。

查询版本的正确 Lambda 翻译是什么?

c# linq entity-framework-core
1个回答
0
投票

通常在发帖后就想出来了......

var query2 = ctx.Players
             .Where(b => b.PlayerId ==2706)
             .GroupJoin(ctx.PlayerOverrides,
                  b => b.PlayerId,
                  p => p.PlayerId,
                  (b, grouping) => new { b, grouping })
               .SelectMany(
                   g => g.grouping.DefaultIfEmpty(),
                   (x, p) => 
                   new PlayerWithOverride 
                   {
                       Player = x.b, PlayerDataOverride = p
                   });
© www.soinside.com 2019 - 2024. All rights reserved.