Linq 和 SQL的左连接、右连接、内链接
在我们工作中表连接是很常用的,但常用的有这三种连接方式:左连接、右连接、内链接
在本章节中讲的是
1、如何在Linq中使用左连接,右连接,内连接。
2、三种连接之间的特点在哪?
3、Linq的三种连接语法是怎么样的呢(我觉得左右连接也就相当换个位置)
一、SQL Server 中的三种连接
首先我们示范以下SQL中的左连接,右连接,内连接,需要准备两张表:
CREATE TABLE [dbo].[Company](
[Id] int identity Primary key,
[Code] uniqueidentifier,
[CompanyName] nvarchar(20) null,
[Address] nvarchar(100) null
)
CREATE TABLE [dbo].[People](
[Id] int identity Primary key,
[CompanyCode] uniqueidentifier null,
[Name] nvarchar(20) null,
[Age] Int null,
)
数据准备
Company

People

在SQL表连接 LEFT JOIN,RIGHT JOIN , INNER JOIN (JOIN)
--通过LEFT JOIN 关键字很明显看出是左连接
SELECT * FROM [People] p LEFT JOIN Company c on p.CompanyCode = c.Code --通过RIGHT JOIN 关键字很明显看出是右连接
SELECT * FROM [Company] c RIGHT JOIN [People] p on p.CompanyCode = c.Code --通过INNER JOIN 关键字很明显看出是内连接
SELECT * FROM [People] p INNER JOIN [Company] c on p.CompanyCode = c.Code
执行后的结果

各连接的特点:
左连接和右连接很好理解,看字面意思就可以知道左连接是按照左边的数据进行显示,如果右边的跟左边的匹配不到则右边的数据会为空,右连接相反
内链接也很好理解,看图可以看出来只要能匹配上的就显示不能匹配的就不显示数据
那么在C# Linq中我们如何实现表连接呢?
二、C# 中使用Linq实现集合之间的连接
同样先准备下类和数据源
Company和People 类
public class Company
{
public int Id { get; set; }
public Guid Code { get; set; }
public string CompanyName { get; set; }
public string Address { get; set; }
} public class People
{
public int Id { get; set; }
public Guid CompanyCode { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
初始数据
List<Company> companyList = new List<Company>(){
new Company() {
Id=,
Code = new Guid("B0C5900C-DC15-4F9B-A2C0-25D79B2987E2"),
CompanyName = "菜鸟公司",
Address = "菜鸟地址",
},
new Company() {
Id=,
Code = new Guid("FA46534F-E5FA-48DD-8C67-58A8FC5573FB"),
CompanyName = "中级地址",
Address = "中级地址",
},
new Company() {
Id=,
Code = new Guid("8188B6E3-1FEA-462F-83A5-A6610996DB42"),
CompanyName = "牛X公司",
Address = "牛X地址",
},
new Company() {
Id=,
Code = new Guid("64CD13EB-398A-4DC2-BFBF-F4032A40DC10"),
CompanyName = "黑马公司",
Address = "黑马地址",
},
};
List<People> peopleList = new List<People>() {
new People() {
Id = ,
CompanyCode = new Guid("B0C5900C-DC15-4F9B-A2C0-25D79B2987E2"),
Name = "Tony",
Age =
},
new People() {
Id = ,
CompanyCode = new Guid("B0C5900C-DC15-4F9B-A2C0-25D79B2987E2"),
Name = "Ramon",
Age =
},
new People() {
Id = ,
CompanyCode = new Guid("FA46534F-E5FA-48DD-8C67-58A8FC5573FB"),
Name = "Ronnin",
Age =
},
new People() {
Id = ,
CompanyCode = new Guid("8188B6E3-1FEA-462F-83A5-A6610996DB42"),
Name = "Vi Vi",
Age =
},
new People() {
Id = ,
CompanyCode = new Guid("E0E04E6B-4E0F-4A83-AFDB-30427221448E"),
Name = "Gary Chan",
Age =
},
};
Linq连接代码
{
Console.WriteLine("-----------------------------------------------------LEFT JION---------------------------------------------------------");
var qurey = from c in companyList
join p in peopleList
on c.Code equals p.CompanyCode into joinCompanyList
from p in joinCompanyList.DefaultIfEmpty()
select new
{
Id = c?.Id,
CompanyName = c?.CompanyName,
CompanyAddress = c?.Address,
peopleName = p?.Name,
peopleAge = p?.Age
};
foreach (var item in qurey)
{
Console.WriteLine($"公司ID:{item.Id},公司名称:{item.CompanyName},公司地址:{item.CompanyAddress},个人名称:{item.peopleName},个人年龄:{item.peopleAge}");
}
}
{
Console.WriteLine("-----------------------------------------------------RIGHT JION---------------------------------------------------------");
var qurey = from p in peopleList
join c in companyList
on p.CompanyCode equals c.Code into joinCompanyList
from c in joinCompanyList.DefaultIfEmpty()
select new
{
Id = c?.Id,
CompanyName = c?.CompanyName,
CompanyAddress = c?.Address,
peopleName = p?.Name,
peopleAge = p?.Age
};
foreach (var item in qurey)
{
Console.WriteLine($"公司ID:{item.Id},公司名称:{item.CompanyName},公司地址:{item.CompanyAddress},个人名称:{item.peopleName},个人年龄:{item.peopleAge}");
}
}
{
Console.WriteLine("-----------------------------------------------------INNER JOIN---------------------------------------------------------");
var qurey = from p in peopleList
join c in companyList
on p.CompanyCode equals c.Code
select new
{
Id = c?.Id,
CompanyName = c?.CompanyName,
CompanyAddress = c?.Address,
peopleName = p?.Name,
peopleAge = p?.Age
};
foreach (var item in qurey)
{
Console.WriteLine($"公司ID:{item.Id},公司名称:{item.CompanyName},公司地址:{item.CompanyAddress},个人名称:{item.peopleName},个人年龄:{item.peopleAge}");
}
}
结果

注:上例中使用了DefaultIfEmpty操作符,它能够为实序列提供一个默认的元素。DefaultIfEmpty使用了泛型中的default关键字。default关键字对于引用类型将返回null,而对于值类型则返回0。对于结构体类型,则会根据其成员类型将它们相应地初始化为null(引用类型)或0(值类型)
本章节就到这里啦,坚持就是胜利.....................
Linq 和 SQL的左连接、右连接、内链接的更多相关文章
- linq to sql 实现左(右)连接,那个方法是对的,该怎么处理
linq to sql 实现左(右)连接,那个方法是对的var query2 = from tb0 in db.table_0 join tb1 in db.table_1 on table_0.关 ...
- Oracle左连接,右连接
Oracle左连接,右连接 数据表的连接有: 1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制 ...
- mysql左连接 右连接 内连接的区别
mysql左连接 右连接 内连接的区别 1.内连接,显示两个表中有联系的所有数据; 2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示 3.右链接,以右表为参照显示数据,,左表中没有则 ...
- linq to entity 左连接 右连接 以及内连接写法的区别
左连右连还是内连这个其实你不需要关心.只需要根据实体的映射关系写查询,框架会自动帮你生成的. 至于linq查询语法与扩展方法的效率,应该是一样的,比如: var users=(from u in db ...
- SQL Server之内连接 左连接 右连接 全连接 交叉连接
SELECT * FROM Table_A GO SELECT * FROM Table_B GO --内连接 SELECT a.*, b.* FROM Table_A a JOIN Table_B ...
- linq的左连接右连接内连接用法
1.左连接: var LeftJoin = from e in ListOfEmployees join d in ListOfDepartment on e.DeptID equals d.ID i ...
- mysql 内连接 左连接 右连接 外连接
mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...
- mysql 左连接 右连接 内链接
一般所说的左连接,右连接是指左外连接,右外连接.做个简单的测试你看吧.先说左外连接和右外连接:[TEST1@orcl#16-12月-11] SQL>select * from t1;ID NAM ...
- mysql中的左连接右连接内连接
一. 初始化SQL语句 /*join 建表语句*/ drop database if exists test; create database test; use test; /* 左表t1*/ dr ...
随机推荐
- Vue.js小案例(2)
即时搜索 这个例子主要应用了vue.js的自定义过滤器,可以通过Vue.filter()注册一个全局过滤器,具体用法可以参考这里,vue.js也提供了一些内置过滤器. CSS代码: [v-cloak] ...
- Struts 2 官方文档中文版
最近正在学 Struts 2 ,咱英文水平不行啊,找到了<Struts 2 官方文档中文版>,虽然翻译的不全,有总比没有强. 地址:https://cwiki.apache.org/con ...
- Oracle案例08——xx.xx.xx.xx,表空间 SYSAUX 使用率>95%%
本实例主要针对Oracle表空间饱满问题处理方法做个步骤分享. 一.告警信息 收到zabbix告警信息,表空间 SYSAUX 使用率>95%%,系统表空间sysaux使用率超过了95%. 二. ...
- 获取当前网页的的url
如果测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPath: / ...
- git 和github
ssh git: 是一个版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这 ...
- webpack笔记一 起步
webpack笔记一 起步 安装 对于大多数项目,我们建议本地安装(--save-dev).这可以在引入突破式变更(breaking change)版本时,更容易分别升级项目. 起步 初始化项目 mk ...
- Asp.Net MVC Identity 2.2.1 使用技巧(六)
使用用户管理器之角色管理 一.建立模型,这里我们其实在之前的技巧(五)已经建好了. 二.建立控制器RolesAdminController 1.在controllers文件夹上点右键>添加> ...
- linux下Python3的安装
linux平台下,需要gcc和openssl-devel的依赖包,所以没有的话需要先安装: yum -y install gcc* yum -y install openssl-devel 然后将 ...
- SoapUI这么好,舍得不用吗?
之前尝试去学习哈SoapUI, 安装都报错,直接拖黑不用,对java开发的产品本身不感冒 后来工作上,和老外沟通,发现他们不会用xmlspy,只会SoapUI,心里都想,不学习看来不方便,然后都安装了 ...
- [TEST123] Performance Test
https://blog.csdn.net/zhouping19851013/article/details/82870789 https://www.cnblogs.com/jackei/archi ...