在我们工作中表连接是很常用的,但常用的有这三种连接方式:左连接、右连接、内链接

在本章节中讲的是
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的左连接、右连接、内链接的更多相关文章

  1. linq to sql 实现左(右)连接,那个方法是对的,该怎么处理

    linq to sql 实现左(右)连接,那个方法是对的var query2 = from tb0 in db.table_0  join tb1 in db.table_1 on table_0.关 ...

  2. Oracle左连接,右连接

    Oracle左连接,右连接 数据表的连接有: 1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制 ...

  3. mysql左连接 右连接 内连接的区别

    mysql左连接 右连接 内连接的区别 1.内连接,显示两个表中有联系的所有数据; 2.左链接,以左表为参照,显示所有数据,右表中没有则以null显示 3.右链接,以右表为参照显示数据,,左表中没有则 ...

  4. linq to entity 左连接 右连接 以及内连接写法的区别

    左连右连还是内连这个其实你不需要关心.只需要根据实体的映射关系写查询,框架会自动帮你生成的. 至于linq查询语法与扩展方法的效率,应该是一样的,比如: var users=(from u in db ...

  5. SQL Server之内连接 左连接 右连接 全连接 交叉连接

    SELECT * FROM Table_A GO SELECT * FROM Table_B GO --内连接 SELECT a.*, b.* FROM Table_A a JOIN Table_B ...

  6. linq的左连接右连接内连接用法

    1.左连接: var LeftJoin = from e in ListOfEmployees join d in ListOfDepartment on e.DeptID equals d.ID i ...

  7. mysql 内连接 左连接 右连接 外连接

    mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | ...

  8. mysql 左连接 右连接 内链接

    一般所说的左连接,右连接是指左外连接,右外连接.做个简单的测试你看吧.先说左外连接和右外连接:[TEST1@orcl#16-12月-11] SQL>select * from t1;ID NAM ...

  9. mysql中的左连接右连接内连接

    一. 初始化SQL语句 /*join 建表语句*/ drop database if exists test; create database test; use test; /* 左表t1*/ dr ...

随机推荐

  1. sublime text3 jQuery Emmet 插件 安装方法,快捷键

    preference->package control->install package> emmet / jQuery 先说jQuery jQuery 集成了很多JS的补全功能.例 ...

  2. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又 ...

  3. WinForm实现Rabbitmq官网6个案例-Hello World

    先上代码 namespace RabbitMQDemo { public partial class HelloWorld : Form { string queueName1 = "hel ...

  4. Hololens开发笔记:UDP接收数据

    Hololens的应用需要与其他设备通信的时候,UDP是比较方便的一种方式,Unity3d 2017.3 C#开发的时候可以用Windows.Networking.Sockets.DatagramSo ...

  5. PHP把下划线分隔命名的字符串与驼峰式命名互转

    最近项目使用symfony框架,这个框架对数据库的操作在这个团队里使用的是ORM进行操作,说实话使用ORM的开发效率和运行效率不一定高多少,到是它的实体命名和现有数据库字段的命名不太一样,ORM实体属 ...

  6. 【转】OmniGraffle (一)从工具栏开始

    原文链接:http://www.jianshu.com/p/52f3ecbe8f2d OmniGraffle的软件布局和大多数图形类软件类似,中间是编辑区,左边是页面和对象组织的管理,右边是参数设置和 ...

  7. Oracle使用ODBC连接配置

    该配置是在windows 7 32位下进行的,程序已经通过了测试(使用VBS进行的测试) 1.文件下载 ------------------------------------------------ ...

  8. 第二课,DOS常用命令及进制转换

    课后的一点小总结还望各位大神点评. 注意事项:1.不要在c盘进行操作. 2.要注意路径. 3.要熟练掌握DOS命令 操作指令(.在本文代表空格,本次以文档为例) 打开DOS:窗口键+r  输入cmd ...

  9. Java学习---程序设计_基础题[1]

    180813 补全没有的答案! 0. 数组排序大全[冒泡/选择/快速/插入] package com.ftl; import java.io.BufferedReader; import java.i ...

  10. 乘风破浪:LeetCode真题_019_Remove Nth Node From End of List

    乘风破浪:LeetCode真题_019_Remove Nth Node From End of List 一.前言 这次总算到了链表的操作了,之后肯定会有排序算法,二叉树,排序树,图等等的操作,现在我 ...