声明:本文为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第二种方法相似,这里再也不进行讲述。