LINQ之 Join 与 GroupJoin
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢!
一、编写Person与City类,如下:

class Person
{
public int CityID { set; get; }
public string Name { set; get; }
}
class City
{
public int ID { set; get; }
public string Name { set; get; }
}

二、为以上两个类建立一些数据,存储于persons与cities中,如下:

Person[] persons = new Person[]
{
new Person{ CityID = , Name = "ABC" },
new Person{ CityID = , Name = "EFG" },
new Person{ CityID = , Name = "HIJ" },
new Person{ CityID = , Name = "KLM" },
new Person{ CityID = , Name = "NOP" },
new Person{ CityID = , Name = "QRS" },
new Person{ CityID = , Name = "TUV" }
};
City[] cities = new City[]
{
new City{ ID = ,Name = "Guangzhou" },
new City{ ID = ,Name = "Shenzhen" },
new City{ ID = ,Name = "Beijing" },
new City{ ID = ,Name = "Shanghai" }
};

三、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);
官方释义:基于匹配键对两个序列的元素进行关联。使用默认的相等比较器对键进行比较。
这个与数据库中的INNER JOIN很类似,就是使用一个键(TKey)将两个集合关联起来,并对这两个集合的元素进行选择,作为结果输出。
1、数据源本身为outer,需要作Join连接的集合为inner;
2、选择一个outer内的一个元素,作为输入参数,并输出一个基于outer的键值;
3、选择一个inner内的一个元素,作为输入参数,并输出一个基于inner的键值;
4、将基于outer的键值与inner的键值作为输入参数,并输出一个自己定义类型的结果选择器;
5、返回的结果就是自己定义类型的集合。
编写客户端试验代码:
var result = persons.Join(cities, p => p.CityID, c => c.ID, (p, c) => new { PersonName = p.Name, CityName = c.Name});
foreach(var item in result)
{
Console.WriteLine($"{item.PersonName},{item.CityName}");
}
从以上可以看出,persons为outer集合,cities为inner集合,p.CityID为outer的键值,c.ID为inner的键值,Join就是将persons内CityID与cities内ID相等性连接起来,并将persons内的每个元素及cities内的每个元素作为输入参数,从从选择自己想要的数据,如自己定义的匿名类型。
因为persons内CityID为5的城市编号不存在与cIties内,因此输出结果不会含Name为“TUV”的信息。
输出结果如下:
其等价的LINQ语句为:
var result = from p in persons
join c in cities on p.CityID equals c.ID
select new { PersonName = p.Name, CityName = c.Name };
四、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进行相等性比较,判断是否进行连接,并输出自己定义的类型集合。
五、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的连接。
编写客户端试验代码:

var result = persons.GroupJoin(cities, p => p.CityID, c => c.ID, (p, cs) => new { PersonName = p.Name, Citys = cs });
foreach (var item in result)
{
Console.Write($"{item.PersonName}\t");
foreach (var city in item.Citys)
{
Console.Write($"{city.Name}");
}
Console.WriteLine();
}

这个输出会将Name为“TUV”的名字输出,但其城市却是空的,原因就是在cities找不到编号为5的City信息。
输出结果如下:
其等价的LINQ语句为:
var result = from p in persons
join c in cities on p.CityID equals c.ID into cs
select new { PersonName = p.Name, Citys = cs };
六、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第二种方法类似,这里不再进行讲述。
LINQ之 Join 与 GroupJoin的更多相关文章
- [C#] LINQ之Join与GroupJoin
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.编写Person与City类,如下: class Person { public int CityID { set; get; } ...
- LINQ标准查询操作符(二)——Join、GroupJoin、GroupBy、Concat、
四.联接操作符 联接是指将一个数据源对象与另一个数据源对象进行关联或者联合的操作.这两个数据源对象通过一个共同的值或者属性进行关联. LINQ有两个联接操作符:Join和GroupJoin. 1. J ...
- [C#]使用Join与GroupJoin将两个集合进行关联与分组
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参 ...
- [C#] LINQ之SelectMany和GroupJoin
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- C#中使用Join与GroupJoin将两个集合进行关联与分组
转自:https://www.cnblogs.com/cncc/p/7985843.html 对于Join的用法说明如下: 语法: public static IEnumerable<TResu ...
- Linq中join & group join & left join 的用法
Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报 分类: C#(14) 文章 ...
- LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法
介绍 ·Select - Select选择:延迟 ·Where - Where查询:延迟 ·OrderBy - 按指定表达式对集合正序排序:延迟 ·OrderByDescend ...
- linq group join
本篇介绍Linq的Group和Join操作,继续使用<Linq 学习(3) 语法结构>中介绍的数据源. GroupGroup是进行分组操作,同SQL中的Group By类似.原型如下: p ...
- Lamda 表达式里的Join和GroupJoin的区别, 如何实现SQL的Left Join效果
例如,可以将产品表与产品类别表相联接,得到产品名称和与其相对应的类别名称 db.Products .Join ( db.Categories, p => p.CategoryID, c => ...
随机推荐
- Xshell的一些使用方法和注意事项
xshell 本文就是想记录下最近遇到的一些问题,以及一些 xshell 能帮助我们提升效率的方面. xshell 编码问题 我们连接服务器,是通过本地登录到 跳板机,然后通过跳板机登录到 我们的服务 ...
- java基础(29):JDBC、DBUtils
1. JDBC 1.1 JDBC概述 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问 ...
- Linux性能分析——分析系统性能相关的命令
Linux性能分析——分析系统性能相关的命令 摘要:本文主要学习了Linux系统中分析性能相关的命令. ps命令 ps命令用来显示系统中进程的运行情况,显示的是当前系统的快照. 基本语法 ps [选项 ...
- Java生鲜电商平台-App系统架构开发与设计
Java生鲜电商平台-App系统架构开发与设计 说明:阅读此文,你可以学习到以下的技术分享 1.Java生鲜电商平台-App架构设计经验谈:接口的设计2.Java生鲜电商平台-App架构设计经验谈:技 ...
- Java日期时间API系列4-----Jdk7及以前的日期时间类的线程安全问题
1.Date类为可变的,在多线程并发环境中会有线程安全问题. (1)可以使用锁来处理并发问题. (2)使用JDK8 Instant 或 LocalDateTime替代. 2.Calendar的子类为 ...
- Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
官网:www.fhadmin.org 特别注意: Springboot 工作流 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...
- 安卓开发笔记(三十五):Cardview的简单使用
首先上图: 我们可以看到上面这个我所编写的界面上,战狼这一个模块则使用了cardview控件,下面我们来看看它是怎么使用的:这里是cardview在线性布局下的的布局代码: <android.s ...
- 9.智能快递柜SDK(串口型锁板)
1.智能快递柜(开篇) 2.智能快递柜(终端篇) 3.智能快递柜(通信篇-HTTP) 4.智能快递柜(通信篇-SOCKET) 5.智能快递柜(通信篇-Server程序) 6.智能快递柜(平台篇) 7. ...
- Android JS打开原生应用
设置App通过网页JS,唤醒打开本地应用. 在AndroidManifest 中,在应用启动页配置下,添加android:exported="true",设置category 添加 ...
- docker 安装 rabbitMQ服务器
1. 镜像拉取 拉取rabbitMQ镜像文件,后边要接上 management 表名是拉取带有web管理端的镜像,有web界面方便管理. 2.默认用户运行镜像 docker run -d -p 567 ...