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 ...
随机推荐
- sublime text3 jQuery Emmet 插件 安装方法,快捷键
preference->package control->install package> emmet / jQuery 先说jQuery jQuery 集成了很多JS的补全功能.例 ...
- java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又 ...
- WinForm实现Rabbitmq官网6个案例-Hello World
先上代码 namespace RabbitMQDemo { public partial class HelloWorld : Form { string queueName1 = "hel ...
- Hololens开发笔记:UDP接收数据
Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSo ...
- PHP把下划线分隔命名的字符串与驼峰式命名互转
最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...
- 【转】OmniGraffle (一)从工具栏开始
原文链接:http://www.jianshu.com/p/52f3ecbe8f2d OmniGraffle的软件布局和大多数图形类软件类似,中间是编辑区,左边是页面和对象组织的管理,右边是参数设置和 ...
- Oracle使用ODBC连接配置
该配置是在windows 7 32位下进行的,程序已经通过了测试(使用VBS进行的测试) 1.文件下载 ------------------------------------------------ ...
- 第二课,DOS常用命令及进制转换
课后的一点小总结还望各位大神点评. 注意事项:1.不要在c盘进行操作. 2.要注意路径. 3.要熟练掌握DOS命令 操作指令(.在本文代表空格,本次以文档为例) 打开DOS:窗口键+r 输入cmd ...
- Java学习---程序设计_基础题[1]
180813 补全没有的答案! 0. 数组排序大全[冒泡/选择/快速/插入] package com.ftl; import java.io.BufferedReader; import java.i ...
- 乘风破浪:LeetCode真题_019_Remove Nth Node From End of List
乘风破浪:LeetCode真题_019_Remove Nth Node From End of List 一.前言 这次总算到了链表的操作了,之后肯定会有排序算法,二叉树,排序树,图等等的操作,现在我 ...