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 ...
随机推荐
- MvcForum中文版+PostgreSql源码下载
演示地址:http://bbs.hfenxiao.com 因为种处原因在家休假,闲来无事,便将去年关注的一个基于asp.net mvc论坛程序拿出来做了一些调整. 据说PostgreSql是世界上功能 ...
- vuex入门教程和思考 [转] 里面有几个实例
Vuex基础概念 vuex中涉及的概念主要有下面几点,下面做个简单的介绍和理解. Vuex 官方文档:https://vuex.vuejs.org/zh-cn/ 官网有介绍,也有个demo shopp ...
- (WCF) 多线程 (Multi-threading) 和 并发性 (Concurency)
问题:WCF 有个Server端,还有个Client端,他们之间是如何进行并发,多线程通信的呢?多个Client端同时访问Server,如何保证Server端的操作线程安全呢? 在理解WCF Conc ...
- Android Tab与TabHost
这就是Tab,而盛放Tab的容器就是TabHost 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了.一个Activity,对应了多个功能布局. ①新建一个Tab项目,注意,不要生成mai ...
- Monte Calro Tree Search (MCTS)
https://blog.csdn.net/natsu1211/article/details/50986810, 感谢分享! Intro最近阿法狗和李师师的人机大战着实火了一把,还顺带捧红了柯杰,古 ...
- Windows系统环境下安装dlib
Windows系统环境下安装dlib 因为今天需要在windows环境下做一些图片处理,所以需要在pycharm中配置环境,而其中需要的主要是dlib的安装: 下面说一下关于dlib的配置安装: —- ...
- MySQL经典错误
本文目录: Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行)Top 2:(主从复制报错类型)Top 3:MySQL安装过程中的报错Top 4:数 ...
- Mysql备份 -----innobackupex
一,原理及介绍〇 xtrabackup能做哪些 对InnoDB引擎的表做热备 增量备份 流压缩传输到另外的服务器上 在线移动表 更简单的创建从库 备份时不增加服务器 ...
- BigDecimal setScale()设置无效 scale()取得的值不是setScale()设置的值
最近查看rebate数据时,发现一个bug,主要现象是,当扣款支付宝的账号款项时,返回的是数字的金额为元,而数据库把金额存储为分,这中间要做元与分的转化,这个转化规则很简单,就是*100的,所以一开始 ...
- 按钮在执行frame动画的时候怎么响应触发事件?
按钮在执行frame动画的时候怎么响应触发事件? 代码中效果(请注意,我并没有点击到按钮,而是点击到按钮的终点frame值处): 对应的代码: // // ViewController.m // Ta ...