C# 实现FULL JOIN 效果
参考:https://dotnettutorials.net/lesson/full-outer-join-in-linq/
思路就是先left join 再right join,最后union
思路就是先left join 再right join,最后union
namespace Test
{
internal class Program
{
static void Main(string[] args)
{
// 创建测试数据
var listA = new List<ItemA>
{
new ItemA { Key = 1, Value = "A1" },
new ItemA { Key = 2, Value = "A2" },
new ItemA { Key = 3, Value = "A3" }
};
var listB = new List<ItemB>
{
new ItemB { Key = 1, Value2 = "B1" },
new ItemB { Key = 2, Value2 = "B2" },
// Comment or uncomment the following line to test with a null entry
new ItemB { Key = 4, Value2 = "B4" }
};
// 执行 full join
var leftJoinQuery = from itemA in listA
join itemB in listB
on itemA.Key equals itemB.Key into gj
from subItemB in gj.DefaultIfEmpty()
select new { Key = itemA.Key, ValueA = itemA.Value, ValueB = (subItemB == null) ? default : subItemB.Value2 };
var rightJoinQuery = from itemB in listB
join itemA in listA
on itemB.Key equals itemA.Key into gj
from subItemA in gj.DefaultIfEmpty()
select new { Key = itemB.Key, ValueA =(subItemA == null)?default: subItemA.Value, ValueB = itemB.Value2 };
var fullJoinQuery= leftJoinQuery.Union(rightJoinQuery);
// 输出结果
foreach (var result in fullJoinQuery)
{
Console.WriteLine($"Key: {result.Key}, ValueA: {result.ValueA}, Value2: {result.ValueB}");
}
}
}
// 测试模型
class ItemA
{
public int Key { get; set; }
public string Value { get; set; }
}
class ItemB
{
public int Key { get; set; }
public string Value2 { get; set; }
}
}
结果


浙公网安备 33010602011771号