Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中进行完全外部联接?_C#_Linq_Join - Fatal编程技术网

如何在c#中进行完全外部联接?

如何在c#中进行完全外部联接?,c#,linq,join,C#,Linq,Join,我是C#中Linq方法的新手。我在学习,我想我了解所有三种类型的连接,即 内连接 团体加入 左外连接 我的理解是,它返回左源序列的所有元素,无论右序列中是否有匹配的元素 现在我有了一个场景,在这个场景中,我想要执行右源序列的所有元素,不管左序列中是否有匹配的元素 我怎样才能做到这一点?您基本上是在询问完全外部联接。在LINQ中,通常使用左右连接和并集。请查看以下线程 样本: var firstNames = new[] { new { ID = 1, Name = "John" },

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

  • 内连接
  • 团体加入
  • 左外连接
  • 我的理解是,它返回左源序列的所有元素,无论右序列中是否有匹配的元素

    现在我有了一个场景,在这个场景中,我想要执行右源序列的所有元素,不管左序列中是否有匹配的元素


    我怎样才能做到这一点?

    您基本上是在询问完全外部联接。在LINQ中,通常使用左右连接和并集。请查看以下线程

    样本:

    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);
    

    您需要一个完全联接,您可以执行
    左联接
    右联接
    ,然后
    联合
    它们,因为在
    linq to entity
    中没有
    完全联接
    ,例如:

            // 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();
    

    连接有三种以上的类型。您想要的联接类型称为外部联接OK,那么哪种联接类型将涵盖我的场景?您不能在LINQ中以与在SQLAnd中相同的方式执行此操作,以供参考: