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; } } }
结果