聲明:本文爲www.cnc6.cn原創,轉載時請註明出處,謝謝!數據庫
1、編寫Person與City類,以下:編程
1 class Person 2 { 3 public int CityID { set; get; } 4 public string Name { set; get; } 5 } 6 class City 7 { 8 public int ID { set; get; } 9 public string Name { set; get; } 10 }
2、爲以上兩個類創建一些數據,存儲於persons與cities中,以下:this
1 Person[] persons = new Person[] 2 { 3 new Person{ CityID = 1, Name = "ABC" }, 4 new Person{ CityID = 1, Name = "EFG" }, 5 new Person{ CityID = 2, Name = "HIJ" }, 6 new Person{ CityID = 3, Name = "KLM" }, 7 new Person{ CityID = 3, Name = "NOP" }, 8 new Person{ CityID = 4, Name = "QRS" }, 9 new Person{ CityID = 5, Name = "TUV" } 10 }; 11 City[] cities = new City[] 12 { 13 new City{ ID = 1,Name = "Guangzhou" }, 14 new City{ ID = 2,Name = "Shenzhen" }, 15 new City{ ID = 3,Name = "Beijing" }, 16 new City{ ID = 4,Name = "Shanghai" } 17 };
3、Join第一種用法:spa
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);
官方釋義:基於匹配鍵對兩個序列的元素進行關聯。使用默認的相等比較器對鍵進行比較。code
這個與數據庫中的INNER JOIN很相似,就是使用一個鍵(TKey)將兩個集合關聯起來,並對這兩個集合的元素進行選擇,做爲結果輸出。blog
一、數據源自己爲outer,須要做Join鏈接的集合爲inner;繼承
二、選擇一個outer內的一個元素,做爲輸入參數,並輸出一個基於outer的鍵值;ci
三、選擇一個inner內的一個元素,做爲輸入參數,並輸出一個基於inner的鍵值;get
四、將基於outer的鍵值與inner的鍵值做爲輸入參數,並輸出一個本身定義類型的結果選擇器;string
五、返回的結果就是本身定義類型的集合。
編寫客戶端試驗代碼:
1 var result = persons.Join(cities, p => p.CityID, c => c.ID, (p, c) => new { PersonName = p.Name, CityName = c.Name}); 2 foreach(var item in result) 3 { 4 Console.WriteLine($"{item.PersonName},{item.CityName}"); 5 }
從以上能夠看出,persons爲outer集合,cities爲inner集合,p.CityID爲outer的鍵值,c.ID爲inner的鍵值,Join就是將persons內CityID與cities內ID相等性鏈接起來,並將persons內的每一個元素及cities內的每一個元素做爲輸入參數,從從選擇本身想要的數據,如本身定義的匿名類型。
由於persons內CityID爲5的城市編號不存在與cIties內,所以輸出結果不會含Name爲「TUV」的信息。
輸出結果以下:
其等價的LINQ語句爲:
1 var result = from p in persons 2 join c in cities on p.CityID equals c.ID 3 select new { PersonName = p.Name, CityName = c.Name };
4、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, IEqualityComparer<TKey> comparer);
官方釋義:基於匹配鍵對兩個序列的元素進行關聯。使用指定的IEqualityComparer<TKey> 對鍵進行比較。
以上與Join第一種方法無非就是多一個IEqualityComparer<TKey>,若是使用一個繼承於IEqualityComparer<TKey>的類初始化comparer,它就會使用該類對對TOuter.TKey及TInner.TKey進行相等性比較,判斷是否進行鏈接,並輸出本身定義的類型集合。
5、GroupJoin第一種方法:
public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector);
官方釋義: 基於鍵相等對兩個序列的元素進行關聯並對結果進行分組。使用默認的相等比較器對鍵進行比較。
這個與數據庫的LEFT OUTER JOIN很相似。與Join的區別就是:GroupJoin內resultSelector的輸入參數從TInner單個元素編程IEnumerable<TInner>元素集合,其餘保持不變。用法與Join差很少,它也是基於TOuter.TKey及TInner.TKey的鏈接。
編寫客戶端試驗代碼:
1 var result = persons.GroupJoin(cities, p => p.CityID, c => c.ID, (p, cs) => new { PersonName = p.Name, Citys = cs }); 2 foreach (var item in result) 3 { 4 Console.Write($"{item.PersonName}\t"); 5 foreach (var city in item.Citys) 6 { 7 Console.Write($"{city.Name}"); 8 } 9 Console.WriteLine(); 10 }
這個輸出會將Name爲「TUV」的名字輸出,但其城市倒是空的,緣由就是在cities找不到編號爲5的City信息。
輸出結果以下:
其等價的LINQ語句爲:
1 var result = from p in persons 2 join c in cities on p.CityID equals c.ID into cs 3 select new { PersonName = p.Name, Citys = cs };
6、GroupJoin第二種方法:
public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, IEqualityComparer<TKey> comparer);
官方釋義:基於鍵相等對兩個序列的元素進行關聯並對結果進行分組。使用指定的IEqualityComparer<TKey>對鍵進行比較。
這個與Join第二種方法相似,這裏再也不進行講述。