在我們工作中表連接是很常用的,但常用的有這三種連接方式:左連接、右連接、內鏈接
在本章節中講的是
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(值類型)