在LINQ中,join可以實現3種類型的聯接,分別是內部聯接、分組聯接、左外部聯接。
- 內部聯接:
private static void UseInnnerJoin() { int[] intArray1 = { 5, 15, 25, 30, 33, 40 }; int[] intArray2 = { 10, 20, 30, 50, 60, 70, 80 }; var query1 = from val1 in intArray1 join val2 in intArray2 on val1 % 5 equals val2 % 15 select new { VAL1 = val1, VAL2 = val2 }; foreach (var item in query1) { Console.WriteLine(item); } }
運行結果:
{ VAL1 = 5, VAL2 = 30 } { VAL1 = 5, VAL2 = 60 } { VAL1 = 15, VAL2 = 30 } { VAL1 = 15, VAL2 = 60 } { VAL1 = 25, VAL2 = 30 } { VAL1 = 25, VAL2 = 60 } { VAL1 = 30, VAL2 = 30 } { VAL1 = 30, VAL2 = 60 } { VAL1 = 40, VAL2 = 30 } { VAL1 = 40, VAL2 = 60 }
- 分組聯接:可用於產生分層的數據結果,它將第一個集合中的每個元素與第二個集合中的一組相關元素進行分配。即使第一個集合中的元素在第二個集合中沒有配對元素,也會爲它產生一個空的分組對象。
private static void UseGroupJoin() { int[] intArray1 = {5, 15, 25, 30, 33, 40}; int[] intArray2 = {10, 20, 30, 50, 60, 70, 80}; var query1 = from val1 in intArray1 join val2 in intArray2 on val1 % 5 equals val2 % 15 into val2Group select new {VAL1 = val1, VAL2Group = val2Group }; foreach (var item in query1) { Console.WriteLine(item.VAL1); foreach (var subItem in item.VAL2Group) { Console.WriteLine(subItem); } Console.WriteLine(); } }
- 左外部聯接:返回第一個集合中的所有元素,無論它是否在第二個集合中有相關元素。在LINQ中,通過對分組鏈接的結果調用DefaultIfEmpty()方法來執行左外部聯接。DefaultIfEmpty()從列表中獲取指定元素,如果列表爲空,則返回默認值。
private static void UseLeftJoin() { int[] intArray1 = { 5, 15, 25, 30, 33, 40 }; int[] intArray2 = { 10, 20, 30, 50, 60, 70, 80 }; var query1 = from val1 in intArray1 join val2 in intArray2 on val1 % 5 equals val2 % 15 into val2Group from grp in val2Group.DefaultIfEmpty() select new { VAL1 = val1, VAL2Group = grp }; foreach (var item in query1) { Console.WriteLine(item); } }
運行結果:
{ VAL1 = 5, VAL2Group = 30 } { VAL1 = 5, VAL2Group = 60 } { VAL1 = 15, VAL2Group = 30 } { VAL1 = 15, VAL2Group = 60 } { VAL1 = 25, VAL2Group = 30 } { VAL1 = 25, VAL2Group = 60 } { VAL1 = 30, VAL2Group = 30 } { VAL1 = 30, VAL2Group = 60 } { VAL1 = 33, VAL2Group = 0 } { VAL1 = 40, VAL2Group = 30 } { VAL1 = 40, VAL2Group = 60 }
左外部聯接和分組聯接雖然相似但並非一樣。分組聯接返回的查詢結果是一種分層數據結構,需要使用兩層foreach才能遍歷它的結果。而左外部聯接是在分組聯接的查詢結果上再進行一次查詢,所以它在join之後還有一個from子句進行查詢。