首页 / 教程列表 / LINQ教程 / LINQ操作符之GroupJoin

LINQ操作符之GroupJoin

2057 更新于: 2022-03-05 读完约需 10 分钟

概述

在上一篇[《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();
        }
    }
}

运行结果同上例所示。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

本文永久链接码友网 » LINQ教程 » LINQ操作符之GroupJoin 分享:

发表评论

登录用户才能发表评论, 请 登 录 或者 注册