聯(lián)接運(yùn)算符將兩個(gè)序列(集合)聯(lián)接并產(chǎn)生結(jié)果。
| 聯(lián)接運(yùn)算符 | 用法 |
|---|---|
| Join | Join 運(yùn)算符根據(jù)一個(gè)鍵連接兩個(gè)序列(集合)并返回結(jié)果序列。 |
| GroupJoin | GroupJoin 運(yùn)算符根據(jù)鍵連接兩個(gè)序列并返回序列組。它類似于 SQL 的左外聯(lián)接。 |
Join運(yùn)算符對(duì)兩個(gè)集合(內(nèi)部集合和外部集合)進(jìn)行操作。它返回一個(gè)新集合,其中包含兩個(gè)集合中滿足指定表達(dá)式的元素。它與SQL的內(nèi)部(inner join)聯(lián)接相同。
Join擴(kuò)展方法有兩個(gè)重載,如下所示。
Join重載方法:
public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector); public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, IEqualityComparer<TKey> comparer);
正如您在第一個(gè)重載中看到的,方法接受五個(gè)輸入?yún)?shù)(除了第一個(gè)“this”參數(shù)):1)outer 2)inner 3)outerKeySelector 4)inner keyselector 5)resultSelector。
讓我們舉一個(gè)簡單的實(shí)例。下面的示例連接兩個(gè)字符串集合,并返回兩個(gè)集合中都包含匹配字符串的新集合。
IList<string> strList1 = new List<string>() {
"One",
"Two",
"Three",
"Four"
};
IList<string> strList2 = new List<string>() {
"One",
"Two",
"Five",
"Six"
};
var innerJoin = strList1.Join(strList2,
str1 => str1,
str2 => str2,
(str1, str2) => str1);輸出結(jié)果:
One Two
現(xiàn)在,讓我們了解使用下面的Student和Standard類的join方法,其中Student類包括與Standard類的StandardID相匹配的StandardID。
public class Student{
public int StudentID { get; set; }
public string StudentName { get; set; }
public int StandardID { get; set; }
}
public class Standard{
public int StandardID { get; set; }
public string StandardName { get; set; }
}下面的示例演示LINQ Join查詢。
示例:C# 聯(lián)接查詢
IList<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", StandardID =1 },
new Student() { StudentID = 2, StudentName = "Moin", StandardID =1 },
new Student() { StudentID = 3, StudentName = "Bill", StandardID =2 },
new Student() { StudentID = 4, StudentName = "Ram" , StandardID =2 },
new Student() { StudentID = 5, StudentName = "Ron" }
};
IList<Standard> standardList = new List<Standard>() {
new Standard(){ StandardID = 1, StandardName="Standard 1"},
new Standard(){ StandardID = 2, StandardName="Standard 2"},
new Standard(){ StandardID = 3, StandardName="Standard 3"}
};
var innerJoin = studentList.Join(// 外序列
standardList, // 內(nèi)部序列
student => student.StandardID, // externalKeySelector
standard => standard.StandardID, // innerKeySelector
(student, standard) => new // 結(jié)果選擇器
{
StudentName = student.StudentName,
StandardName = standard.StandardName
});下圖說明了上面示例中的Join運(yùn)算符的各個(gè)部分。

在上面的聯(lián)接查詢示例中,studentList是外部序列,因?yàn)椴樵儚乃_始。Join方法中的第一個(gè)參數(shù)用于指定內(nèi)部序列,在上面的示例中該序列為standardList。Join方法的第二個(gè)和第三個(gè)參數(shù)用于指定一個(gè)字段,該字段的值應(yīng)使用lambda表達(dá)式匹配,以便將元素包括在結(jié)果中。外部序列的鍵選擇器 student => student.StandardID指示StudentList的每個(gè)元素的標(biāo)準(zhǔn)ID字段應(yīng)該與內(nèi)部序列 standard => standard.StandardID 的鍵匹配。如果兩個(gè)鍵字段的值都匹配,則將該元素包括到結(jié)果中。
Join方法中的最后一個(gè)參數(shù)是用于表達(dá)結(jié)果的表達(dá)式。在上面的示例中,結(jié)果選擇器包括兩個(gè)序列的StudentName和StandardName屬性。
兩個(gè)序列(集合)的StandardID鍵必須匹配,否則該項(xiàng)將不包括在結(jié)果中。例如,Ron不與任何標(biāo)準(zhǔn)關(guān)聯(lián),因此Ron不包含在結(jié)果集合中。上述示例中的innerJoinResult在執(zhí)行后將包含以下元素:
John - Standard 1 Moin - Standard 1 Bill - Standard 2 Ram - Standard 2
下面的示例演示VB.Net中方法語法中的Join運(yùn)算符。
Dim innerJoin = studentList.Join(standardList,
Function(s) s.StandardID,
Function(std) std.StandardID,
Function(s, std) New With
{
.StudentName = s.StudentName,
.StandardName = std.StandardName
});查詢語法中的連接運(yùn)算符的工作原理與方法語法略有不同。它需要外部序列、內(nèi)部序列、鍵選擇器和結(jié)果選擇器“on”關(guān)鍵字用于鍵選擇器,其中“equals”運(yùn)算符的左側(cè)是outerKeySelector,“equals”運(yùn)算符的右側(cè)是innerKeySelector。
from ... in outerSequence join ... in innerSequence on outerKey equals innerKey select ...
下面的查詢語法中的Join運(yùn)算符示例,如果Student.StandardID和Standard.StandardID匹配,則返回來自studentList和standardList的元素的集合。
示例:C#使用查詢語法join聯(lián)接運(yùn)算符
IList<Student> studentList = new List<Student>() {
new Student() { StudentID = 1, StudentName = "John", Age = 13, StandardID =1 },
new Student() { StudentID = 2, StudentName = "Moin", Age = 21, StandardID =1 },
new Student() { StudentID = 3, StudentName = "Bill", Age = 18, StandardID =2 },
new Student() { StudentID = 4, StudentName = "Ram" , Age = 20, StandardID =2 },
new Student() { StudentID = 5, StudentName = "Ron" , Age = 15 }
};
IList<Standard> standardList = new List<Standard>() {
new Standard(){ StandardID = 1, StandardName="Standard 1"},
new Standard(){ StandardID = 2, StandardName="Standard 2"},
new Standard(){ StandardID = 3, StandardName="Standard 3"}
};
var innerJoin = from s in studentList // 外序列
join st in standardList //內(nèi)部序列
on s.StandardID equals st.StandardID // 鍵選擇器
select new { // 結(jié)果選擇器
StudentName = s.StudentName,
StandardName = st.StandardName
};示例:VB.Net中的查詢語法聯(lián)接運(yùn)算符
Dim innerJoin = From s In studentList ' outer sequence Join std In standardList ' inner sequence On s.StandardID Equals std.StandardID '鍵選擇器 Select _ ' 選擇器結(jié)果 StudentName = s.StudentName, StandardName = std.StandardName
John - Standard 1 Moin - Standard 1 Bill - Standard 2 Ram - Standard 2
使用equals運(yùn)算符匹配查詢語法中的鍵選擇器。==無效。
Join 和 GroupJoin是連接運(yùn)算符。
Join 類似于SQL的內(nèi)部連接。它返回一個(gè)新集合,其中包含兩個(gè)鍵匹配的集合中的公共元素。
Join 對(duì)內(nèi)部序列和外部序列這兩個(gè)序列進(jìn)行運(yùn)算,并生成結(jié)果序列。
Join 查詢語法:
from... in outerSequence join... in innerSequence on outerKey equals innerKey select ...