概述
在上一篇《LINQ操作符之Join概述》中,我们学习了C#语言中LINQ的Join操作符的基本概念,了解了LINQ可以执行不同类型的连接,比如:内连接、左连接、右连接、全连接和交叉连接。
在这一篇中,我们将通过一些详细示例学习LINQ操作符Join(内连接)是如何使用的。
什么是LINQ的内连接?
按照微软文档的说法:
内部连接生成一个结果集,其中第一个集合的每个元素对于第二个集合中的每个匹配元素都出现一次。如果第一个集合中的元素在第二个集合中没有任何匹配的元素,那么它就不会出现在结果集中。
简言之,我们可以说内连接仅用于从两个数据源返回匹配的元素,而从结果集中删除不匹配的元素。
因此,如果有两个数据源,并且当执行LINQ内连接时,那么只有在两个数据源中都存在的匹配元素才会包含在结果集中,如下示意图:
当执行LINQ内连接时,两个数据源(Table A, Table B)中都应该存在一个共同的元素或属性。
LINQ Join方法
C#语言中LINQ的Join方法操作两个数据源,或者你可以说两个集合,比如内部集合和外部集合。此操作符返回一个新集合,其中包含来自两个集合的数据,它与SQL连接操作符相同。
以下是Join
静态扩展方法的源代码:
如你所见,LINQ中的Join
方法有两个重载可用来执行内连接操作。第二个重载接受一个比较器作为额外的参数。
所以,在使用LINQ的Join
方法进行内连接操作时,你需要至少准备以下几个参数:
- 外部数据源(左表)
- 内部数据源(右表)
- 外部键选择器(左表数据源中的公共键)
- 内部键选择器(右表数据源中的公共键)
- 结果选择器(期望返回的结果集)
在了解并学习C#语言中LINQ的Join
操作符的基础理论知识后,下面将结合示例来深入理解Join
操作符的内连接。
准备实体模型及示例数据
本篇所用的示例均可在本系列教程的开篇《关于教程》处获取。
Join示例一
基于LINQ方法的Join
连接示例:
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
var customers = FakeData.Customers;
var addresses = FakeData.Addresses;
var result = customers // 1.外部数据源
.Join(
addresses // 2.内部数据源
, c => c.AddressId // 3.外部键选择器
, a => a.Id // 4.内部键选择器
, (customer, address) => new // 5.期望返回的结果集选择器
{
name = customer.Name,
province = address.Province,
city = address.City,
district = address.District,
street = address.Street
})
.ToList();
foreach (var item in result)
{
Console.WriteLine($"name:{item.name},province:{item.province},city:{item.city},district:{item.district},street:{item.street}");
}
Console.ReadKey();
}
}
}
运行结果:
name:Rector,province:重庆,city:重庆,district:渝北区,street:回兴街道
name:Anna,province:重庆,city:重庆,district:江北区,street:观音桥街道
name:Xi,province:重庆,city:重庆,district:渝北区,street:回兴街道
name:Curry,province:上海,city:上海,district:黄浦区,street:外滩街道
Join示例二
基于LINQ查询语法的Join
示例:
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
var customers = FakeData.Customers;
var addresses = FakeData.Addresses;
var result = (from c in customers // 1.外部数据源
join a in addresses // 2.内部数据源
on c.AddressId equals a.Id // 3.数据源连接条件
select new // 4.期望返回的结果集选择器
{
name = c.Name,
province = a.Province,
city = a.City,
district = a.District,
street = a.Street
}
).ToList();
foreach (var item in result)
{
Console.WriteLine($"name:{item.name},province:{item.province},city:{item.city},district:{item.district},street:{item.street}");
}
Console.ReadKey();
}
}
}
发表评论
登录用户才能发表评论, 请 登 录 或者 注册