c#查詢關鍵字之join 子句運用方法

引導語:c#是第一個面向組件的編程語言,其源碼會編譯成msil再運行。以下是小編整理的c#查詢關鍵字之join 子句運用方法,歡迎參考閱讀!

c#查詢關鍵字之join 子句運用方法

使用 join 子句可以將來自不同源序列並且在對象模型中沒有直接關係的元素相關聯。唯一的要求是每個源中的元素需要共享某個可以進行比較以判斷是否相等的值。例如,食品經銷商可能具有某種產品的供應商列表以及買主列表。例如,可以使用 join 子句創建該產品同一指定地區供應商和買主的列表。

join 子句接受兩個源序列作爲輸入。每個序列中的元素都必須是可以與另一個序列中的相應屬性進行比較的屬性,或者包含一個這樣的屬性。join 子句使用特殊的 equals 關鍵字比較指定的鍵是否相等。join 子句執行的所有聯接都是同等聯接。join 子句的輸出形式取決於所執行的聯接的具體類型。以下是三種最常見的聯接類型:

內部聯接

下面的示例演示一個簡單的內部同等聯接。此查詢產生一個“產品名稱/類別”對平面序列。同一類別字符串將出現在多個元素中。如果 categories 中的某個元素不具有匹配的 products,則該類別不會出現在結果中。

C#

var innerJoinQuery =

from category in categories

join prod in products on equals goryID

select new { ProductName = , Category = }; //produces flat sequence

分組聯接

含有 into 表達式的 join 子句稱爲分組聯接。

C#

var innerGroupJoinQuery =

from category in categories

join prod in products on equals goryID into prodGroup

select new { CategoryName = , Products = prodGroup };

分組聯接會產生一個分層的結果序列,該序列將左側源序列中的元素與右側源序列中的一個或多個匹配元素相關聯。分組聯接沒有等效的關係術語;它本質上是一個對象數組序列。

如果在右側源序列中找不到與左側源中的元素相匹配的元素,則 join 子句會爲該項產生一個空數組。因此,分組聯接基本上仍然是一種內部同等聯接,區別只在於分組聯接將結果序列組織爲多個組。

如果您只選擇分組聯接的結果,則可以訪問各個項,但無法識別結果所匹配的鍵。因此,通常更爲有用的做法是選擇分組聯接的結果並放入一個也具有該鍵名的新類型中,如上一個示例所示。

當然,還可以將分組聯接的'結果用作其他子查詢的生成器:

C#

var innerGroupJoinQuery2 =

from category in categories

join prod in products on equals goryID into prodGroup

from prod2 in prodGroup

where Price > 2.50M

select prod2;

左外部聯接

在左外部聯接中,將返回左側源序列中的所有元素,即使它們在右側序列中沒有匹配的元素也是如此。若要在 LINQ 中執行左外部聯接,請將 DefaultIfEmpty 方法與分組聯接結合起來,以指定要在某個左側元素不具有匹配元素時產生的默認右側元素。可以使用 null 作爲任何引用類型的默認值,也可以指定用戶定義的默認類型。下面的示例演示了用戶定義的默認類型:

C#

var leftOuterJoinQuery =

from category in categories

join prod in products on equals goryID into prodGroup

from item in ultIfEmpty(new Product{Name = y, CategoryID = 0})

select new { CatName = , ProdName = };

equals 運算符

join 子句執行同等聯接。換句話說,只能基於兩個鍵之間的相等關係進行匹配。其他類型的比較(例如,“greater than”或“not equals”)不受支持。爲了表明所有聯接都是同等聯接,join 子句使用 equals 關鍵字而不是 == 運算符。equals 關鍵字只能用在 join 子句中,並且它與 == 運算符之間存在一個重要區別。對於 equals,左鍵使用外部源序列,而右鍵使用內部源序列。外部源僅在 equals 的左側位於範圍內,而內部源序列僅在其右側位於範圍內。

非同等聯接

通過使用多個 from 子句將新序列單獨引入到查詢中,可以執行非同等聯接、交叉聯接和其他自定義聯接操作。

對象集合聯接與關係表聯接

在 LINQ 查詢表達式中,聯接操作是在對象集合上執行的。不能使用與兩個關係表完全相同的方式“聯接”對象集合。在 LINQ 中,僅當兩個源序列沒有通過任何關係相互聯繫時,才需要使用顯式 join 子句。使用 LINQ to SQL 時,外鍵表在對象模型中表示爲主表的屬性。例如,在 Northwind 數據庫中,Customer 表與 Orders 表之間具有外鍵關係。在將這兩個表映射到對象模型時,Customer 類具有一個 Orders 屬性,該屬性包含與該 Customer 相關聯的 Orders 的集合。實際上,已經爲您執行了聯接。

複合鍵

使用複合鍵可以測試多個值是否相等。還可以在 group 子句中使用組合鍵。