概述
在上一篇[《LINQ操作符之Join》][1]中,我们学习了LINQ的Join
连接操作符,能使用Join
将两个不同数据集的数据按特定的选择器进行连接和查询。
本篇中,将学习C#语言中LINQ操作符的另一种连接操作符—GroupJoin
。
什么是GroupJoin?
在LINQ中,我们可以基于一个公共键(该键必须在两个数据源中都存在)在两个或多个数据源上应用GroupJoin
,然后它以组的形式生成结果集。
简单地说,我们可以说Linq的GroupJoin
用于根据公共键对结果集进行分组。
因此,GroupJoin
基本上是用来生成分组数据结构的。来自第一个数据源的每个项都与来自第二个数据源的一组相关项配对。GroupJoin
方法有两个重载,如下所示:
这两个方法之间的区别在于第二个重载多了一个额外的IEqualityComparer
参数。
在使用LINQ的GroupJoin
方法进行内连接操作时,需要至少准备以下几个参数:
- 外部数据源(左表)
- 内部数据源(右表)
- 外部键选择器(左表数据源中的公共键)
- 内部键选择器(右表数据源中的公共键)
- 结果选择器(期望返回的结果集)
LINQ方法语法实现的GroupJoin示例
以下示例将以ShppingAddress
作为分组依据对Customer
进行分组(GroupJoin
),两个数据源的公共键为AddressId
,使用GroupJoin
方法语法的示例代码如下:
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
var customers = FakeData.Customers;
var addresses = FakeData.Addresses;
var groupJoinResult = addresses // 外部数据源(左表)
.GroupJoin(
customers, // 内部数据源(右表)
address => address.Id, // 外部键选择器(左表数据源中的公共键)
customer => customer.AddressId, // 内部键选择器(右表数据源中的公共键)
(address, customer) => new // 结果选择器(期望返回的结果集)
{
address,
customer
})
.ToList();
foreach (var group in groupJoinResult)
{
var item = group.address;
Console.WriteLine($"province:{item.Province},city:{item.City},district:{item.District},street:{item.Street}");
foreach (var c in group.customer)
{
Console.WriteLine($" {c.Id},{c.Name}");
}
}
Console.ReadKey();
}
}
}
运行结果:
从控制台输出的运行结果可以看到,程序按照配送地址(具体到街道)将用户进行了分组。其中,位于回兴街道的用户有2
人,观音桥街道有1
人,外滩街道有1
人,其余街道没有用户数据。
LINQ查询语法实现的GroupJoin示例
using System;
using System.Linq;
namespace LinqTutorial
{
public class MyProgram
{
static void Main(string[] args)
{
var customers = FakeData.Customers;
var addresses = FakeData.Addresses;
var groupJoinResult = (from address in addresses // 外部数据源(左表)
join customer in customers // 内部数据源(右表)
on address.Id equals customer.AddressId // 两个数据源的公共键
into c
select new // 结果选择器(期望返回的结果集)
{
address,
customer = c
}
)
.ToList();
foreach (var group in groupJoinResult)
{
var item = group.address;
Console.WriteLine($"province:{item.Province},city:{item.City},district:{item.District},street:{item.Street}");
foreach (var c in group.customer)
{
Console.WriteLine($" {c.Id},{c.Name}");
}
}
Console.ReadKey();
}
}
}
运行结果同上例所示。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册