它通过 linq 中的两个字段与左连接交叉两个表

It crosses two tables with left join with two fields in linq

我有问题。

我的查询包含:

left join tclientes b on b.codplaza=a.codplaza and b.codcli=a.codcli

在"and"中它第二次跨越table A和table B,我想用linq实现:

 var ret = Context.tH
            .GroupJoin(
                    Context.t,
                    tH => tH.cod,
                    t => t.cod,
                    (x, y) => new { tH = x, t = y })
            .Where(R => R.tH.codplaza_usu == placeCode && R.tH.codusuario == codusuario && R.tH.codcli != -1)
            .SelectMany(
                xy => xy.t.DefaultIfEmpty(),
                (x, y) => new { tH = x.tH, t = y })
            .Select(s => new TClientesDMO
            {
                codplaza = s.tH.codplaza,
            }).ToList();

如何添加左连接的第二个条件?

据我了解您的问题、查询和提到的 "double crossing",可能的解决方案或方法可能是:

var result = (from th in Context.tH
    join t in Context.t on new {CodPlaza = th.codplaza, CodCli = th.codcli} equals new { CodPlaza = t.codplaza, CodCli = t.codcli }
    where th.codplaza_usu == placeCode 
        && th.codusuario == codusuario 
        && th.codcli != -1
    select new TClientesDMO
    {
        codplaza = th.codplaza,
    }).ToList();

此查询将 return 来自 tH 的所有 codplaza,它们在属性 codplazacodcli 上与 t 连接。此外,只有 tH 个具有 codplaza_usu == placeCodecodusuario == codusuariocodcli != -1 的对象将被考虑。 希望能满足您的需求。

是否也需要 "empty" (DefaultIfEmpty()) 条目? 如果查询不符合您的预期结果,请提供更多信息。