如何在 c# 中进行完全外部联接
本文关键字:外部 | 更新日期: 2023-09-27 17:56:15
我是 C# 中 Linq 方法的新手。我正在学习加入子句,我想我理解所有三种类型的连接,即
- 内联接
- 组加入
- 左外连接
我对左外连接的理解是,无论右序列中是否存在匹配的元素,它都会返回左源序列的所有元素。
现在我有一个场景,我想执行左外连接,并且我还想要右源序列的所有元素,无论左序列中是否有匹配的元素。
我该怎么做?
你基本上是在问完全外部连接。在 LINQ 中,通常使用左右联接和联合在一起。请查看以下主题
线程 1线程 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);
你需要
一个完全的连接,你可以做一个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();