如何在 C# 中使用 LINQ 应用右外连接?

Posted

技术标签:

【中文标题】如何在 C# 中使用 LINQ 应用右外连接?【英文标题】:How to apply Right Outer Join using LINQ in C#? 【发布时间】:2021-01-01 19:36:10 【问题描述】:

我在 LINQ 中应用 Right Outer Join 时遇到问题。我正在尝试通过从 SQL 查询转换来在 LINQ 中构建类似的查询。

我正确的 SQL 查询

select *
from Table1 t1
inner join Table2 t2 on t1.Id = t2.FID and t1.CID = 20
right outer join Table3 t3 on t1.GID = t3.GID
var result = from t1 in Table1
             join t2 in Table2
               on t1.ID equals t2.FID into gr1
             where t1.CID = 20
             join t3 in Table3
               on t1.GID equals t3.GID into gr2
             from t3 in gr2.DefaultIfEmpty()
             select new Details ()

             
          return result.ToList();

我的 LINQ 查询没有像 SQL 查询那样工作。

【问题讨论】:

【参考方案1】:

这也在这里讨论 how to make a right join using LINQ to SQL & C#

 var RightJoin = from adds in dc.EmpresaAddendas
             join cats in CatAddendas 
                 on adds.IDAddenda equals cats.IDAddenda into joined
             from cats in joined.DefaultIfEmpty()
             select new
             
                 Id = cats.IDAddenda,
                 Description = cats.Descripcion 
             ;

【讨论】:

【参考方案2】:

试试这个:

var result = from t1 in Table1
             join t2 in Table2
               on new  id = t1.ID; cid = t1.CID  equals new  id = t2.FID: cid = 20 into gr1
             join t3 in Table3
               on t1.GID equals t3.GID into gr2
             from t123 in gr2.DefaultIfEmpty()
             select new Details ()

             
          return result.ToList();

【讨论】:

【参考方案3】:

如您所见,大多数 LINQ 提供程序不提供对 right join 的支持。 DefaultIfEmpty 转换为LEFT join。因此,您需要稍微翻转一下查询的逻辑,以将右连接变为左连接。

就实际语法而言,我已经成功地采用了更多的 ANSI-82 语法,而不是担心 into temp2 from temp3 in temp2 语法。大致如下:

var result = 
    from t3 in Table3
    from t1 in Table1.Where(temp1 => temp1.GID == t3.GID).DefaultIfEmpty()
    join t2 in Table2 on t1ID equals t2.FID
    where t1.CID == 20
    select new Details;

【讨论】:

以上是关于如何在 C# 中使用 LINQ 应用右外连接?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to SQL 右外连接

C# 中的 LINQ to SQL 查询

何时或为啥要使用右外连接而不是左连接?

右外连接问题

Oracle 右外连接

深入理解关系中的外连接,左外连接,右外连接