C# 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=1,
        Code = new Guid("B0C5900C-DC15-4F9B-A2C0-25D79B2987E2"),
        CompanyName = "菜鳥公司",
        Address = "菜鳥地址",
    },
    new Company() {
        Id=2,
        Code = new Guid("FA46534F-E5FA-48DD-8C67-58A8FC5573FB"),
        CompanyName = "中級地址",
        Address = "中級地址",
    },
    new Company() {
        Id=3,
        Code = new Guid("8188B6E3-1FEA-462F-83A5-A6610996DB42"),
        CompanyName = "牛X公司",
        Address = "牛X地址",
    },
    new Company() {
        Id=4,
        Code = new Guid("64CD13EB-398A-4DC2-BFBF-F4032A40DC10"),
        CompanyName = "黑馬公司",
        Address = "黑馬地址",
    },
};


List<People> peopleList = new List<People>() {
    new People() {
        Id = 1,
        CompanyCode = new Guid("B0C5900C-DC15-4F9B-A2C0-25D79B2987E2"),
        Name = "Tony",
        Age = 18
    },
        new People() {
        Id = 2,
        CompanyCode = new Guid("B0C5900C-DC15-4F9B-A2C0-25D79B2987E2"),
        Name = "Ramon",
        Age = 18
    },
        new People() {
        Id = 3,
        CompanyCode = new Guid("FA46534F-E5FA-48DD-8C67-58A8FC5573FB"),
        Name = "Ronnin",
        Age = 18
    },
        new People() {
        Id = 4,
        CompanyCode = new Guid("8188B6E3-1FEA-462F-83A5-A6610996DB42"),
        Name = "Vi Vi",
        Age = 18
    },
        new People() {
        Id = 4,
        CompanyCode = new Guid("E0E04E6B-4E0F-4A83-AFDB-30427221448E"),
        Name = "Gary Chan",
        Age = 18
    },
};

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(值類型)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM