如何在 C# 中进行完全外连接? [复制]

Posted

技术标签:

【中文标题】如何在 C# 中进行完全外连接? [复制]【英文标题】:How to do full outer join in c#? [duplicate] 【发布时间】:2014-05-14 19:17:01 【问题描述】:

我是 C# 中 Linq 方法的新手。我正在学习Join clause,我想我了解所有三种类型的连接,即

    内连接 群组加入 左外连接

我对@9​​87654322@的理解是它返回左源序列的所有元素,无论右序列中是否存在匹配元素。

现在我有一个场景,我想执行Left Outer Join 并且我想要右源序列的所有元素,无论左序列中是否存在匹配元素。

我该怎么做?

【问题讨论】:

连接的类型不止三种。您想要的联接类型称为外部联接 好的,那么哪种类型的连接将涵盖我的场景? 您不能在 LINQ 中像在 SQL 中那样执行此操作 ***.com/a/13503860/1398425 供您参考:blog.codinghorror.com/a-visual-explanation-of-sql-joins 【参考方案1】:

您基本上是在询问完全外部联接。在 LINQ 中通常使用左右连接和联合。请查看以下主题

Thread 1 Thread 2

示例:

var firstNames = new[]

    new  ID = 1, Name = "John" ,
    new  ID = 2, Name = "Sue" ,
;
var lastNames = new[]

    new  ID = 1, Name = "Doe" ,
    new  ID = 3, Name = "Smith" ,
;
var leftOuterJoin = from first in firstNames
                    join last in lastNames
                    on first.ID equals last.ID
                    into temp
                    from last in temp.DefaultIfEmpty(new  first.ID, Name = default(string) )
                    select new
                    
                        first.ID,
                        FirstName = first.Name,
                        LastName = last.Name,
                    ;
var rightOuterJoin = from last in lastNames
                     join first in firstNames
                     on last.ID equals first.ID
                     into temp
                     from first in temp.DefaultIfEmpty(new  last.ID, Name = default(string) )
                     select new
                     
                         last.ID,
                         FirstName = first.Name,
                         LastName = last.Name,
                     ;
var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin);

【讨论】:

【参考方案2】:

你需要一个完整的加入,你可以做一个left join和一个right join然后union他们,因为linq to entity没有full join,例如:

        // left join: left table = TableA, right table = TableB
        var q1 = (from a in TableA
                  join b in TableB on a.ID equals b.ID into JoinedList
                  from b in JoinedList.DefaultIfEmpty()
                  select new
                  
                      a,
                      b
                  );

        // right join: left table = TableB, right table = TableA
        var q2 = (from b in TableB
                  join a in TableA on b.ID equals a.ID into JoinedList
                  from a in JoinedList.DefaultIfEmpty()
                  select new
                  
                      a,
                      b
                  );

        var query = q1.Union(q2).ToList();

【讨论】:

以上是关于如何在 C# 中进行完全外连接? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

哈希完全外连接如何工作?

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

如何在 Linq 中执行左外连接? [复制]

如何使用 C# 在 access 数据库中实现“右外连接”查询?

如何进行全外连接?

左、右、外连接和内连接有啥区别? [复制]