linq中的连接操作符

当我们在使用Linq时,有时候我们需要将两个数据源进行连接(Join)操作,LINQ提供了以下几种连接操作符:

  • Inner Join(join in)
  • Left Outer Join (join...into...from...DefaultIfEmpty)
  • Right Outer Join (join...into...from...DefaultIfEmpty)
  • Full Outer Join (两次外连接操作union操作)

下面我们分别进行详细讲解,并给出相应的示例:

1. Inner Join

Inner Join只返回两个数据源中匹配的集合,语法格式如下:

var query = from s in source
            join o in other
            on s.Key equals o.Key
            select new { s, o };

其中source和other都是需要连接的集合,s和o表示在连接后的匹配项,select语句可以对匹配的s和o进行筛选(即获取需要的值)。

下面是一个实际的示例:

假设我们有两个Class对象的集合,一个是所有学生列表,一个是所有教师列表,现在我们需要找出所有学生和他们的授课老师,则可以使用Inner Join连接操作,示例代码如下:

class Teacher
{
    public string Name { get; set; }

    public int ID { get; set; }

    public override string ToString()
    {
        return $"{ID}:{Name} ";
    }
}

class Student
{
    public string Name { get; set; }

    public int ID { get; set; }

    public int TeacherID { get; set; }

    public override string ToString()
    {
        return $"{ID}:{Name} ";
    }
}

class TestClass
{
    static void Main(string[] args)
    {
        List<Teacher> teachers = new List<Teacher>()
        {
            new Teacher(){ID=1, Name="Tom"},
            new Teacher(){ID=2, Name="Jerry"},
            new Teacher(){ID=3, Name="Nick"}
        };
        List<Student> students = new List<Student>()
        {
            new Student(){ID=101, Name="小明", TeacherID=1},
            new Student(){ID=102, Name="小花", TeacherID=1},
            new Student(){ID=103, Name="小李", TeacherID=2},
            new Student(){ID=104, Name="小赵", TeacherID=3},
        };

        var query = from s in students
                    join t in teachers
                    on s.TeacherID equals t.ID
                    select new { s.ID, s.Name, TeacherName=t.Name };

        foreach (var item in query)
        {
            Console.WriteLine($"{item.ID}:{item.Name}:{item.TeacherName}");
        }
    }
 }

运行以上代码可以得到输出结果:

101:小明:Tom
102:小花:Tom
103:小李:Jerry
104:小赵:Nick

2. Left Outer Join

Left Outer Join连接相当于查询source集合中的数据即使在other集合中不存在也会返回,other集合中对应的部分为null,其语法格式如下:

var query = from s in source
            join o in other
            on s equals o into sg
            from x in sg.DefaultIfEmpty()
            select new { s, x };

其中source和other分别表示要连接的两个集合,"on s equals o into sg"表示将连接后的结果按照key分组,"from x in sg.DefaultIfEmpty()"表示将连接后的集合再次遍历,将不存在的部分用Nullable变量默认值代替。

以下是一个示例代码:

class TestClass
{
    static void Main(string[] args)
    {
        List<string> source = new List<string>() { "A", "B", "C","D","E"};
        List<string> other = new List<string>() { "A", "D", "F"};

        var query = from s in source
                    join o in other
                    on s equals o into sg
                    from x in sg.DefaultIfEmpty()
                    select new { s, x };

        foreach (var item in query)
        {
            Console.WriteLine($"{item.s},{item.x}");
        }
    }
}

执行以上代码,可以得到输出结果:

A,A
B,
C,
D,D
E,

以上我们就给出了Linq中连接操作符的完整攻略,其中包含Inner Join和Left Outer Join两种连接操作符的详细讲解及示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linq中的连接操作符 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • jQuery+Asp.Net实现省市二级联动功能的方法

    下面是关于“jQuery+Asp.Net实现省市二级联动功能的方法”的完整攻略: 一、前置知识 在实现该功能前,你需要具备以下前置知识: HTML、CSS基本语法 jQuery基本用法 Asp.Net基本知识 二、具体实现步骤 1. 在HTML页面中添加表单元素 首先,在HTML页面中添加两个下拉框,分别用来显示“省份”和“城市”。HTML代码如下: &lt…

    C# 2023年5月31日
    00
  • ASP.NET Core中的通用主机HostBuilder

    ASP.NET Core中的通用主机HostBuilder是一种用于构建和配置应用程序主机的通用机制。HostBuilder提供了一种简单的方式来配置应用程序的服务、配置和日志记录等方面。下面是ASP.NET Core中的通用主机HostBuilder的完整攻略。 什么是HostBuilder? 在ASP.NET Core中,HostBuilder是一种用于…

    C# 2023年5月16日
    00
  • C#实现进制转换

    C#实现进制转换的完整攻略 在C#中,要实现进制转换可以使用Convert类提供的方法,主要有以下三个: ToInt32:将指定的字符串转换为32位带符号整数。 ToString:将指定的数字转换为字符串。 Parse:将字符串表示形式转换为等效的数字表示形式。 十进制转二进制 定义一个十进制数 int number = 123; 将其转换为二进制数 str…

    C# 2023年6月6日
    00
  • ASP.NET Core Web资源打包与压缩技术介绍

    在ASP.NET Core中,可以使用Web资源打包和压缩技术来提高Web应用程序的性能和加载速度。本文将介绍ASP.NET Core Web资源打包和压缩技术的完整攻略。 步骤 步骤1:安装Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation包 首先,需要安装Microsoft.AspNetCore.Mvc.R…

    C# 2023年5月17日
    00
  • Asp.net core程序中使用微软的依赖注入框架

    Asp.net core程序中使用微软的依赖注入框架 在Asp.net core程序中,使用微软的依赖注入框架可以方便地管理应用程序中的依赖项。在本攻略中,我们将介绍如何在Asp.net core程序中使用微软的依赖注入框架,并提供两个示例说明。 步骤一:安装依赖注入框架 在项目中安装依赖注入框架 在项目中安装依赖注入框架。可以使用NuGet包管理器或者在项…

    C# 2023年5月16日
    00
  • C#中Dictionary泛型集合7种常见的用法

    下面是”C#中Dictionary泛型集合7种常见的用法”的完整攻略: 1. 创建Dictionary对象 使用Dictionary之前,首先需要创建Dictionary对象。可以通过以下代码创建: Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>(); 其中,T…

    C# 2023年5月31日
    00
  • C#实现线程池的简单示例

    下面是呈现 C#实现线程池的简单示例 的攻略。 一、什么是线程池 线程池是一种应对多线程编程,用于优化性能的一种技术。简而言之,线程池就是提前创建一堆线程,放入一个池子中,等待其他任务出现时就可以利用这些线程来处理它们,从而避免了每次出现任务时都需要创建新线程的开销。 二、.NET官方提供的线程池 .NET官方提供了ThreadPool类,该类提供了一个全局…

    C# 2023年6月7日
    00
  • C#直线的最小二乘法线性回归运算实例

    C#直线的最小二乘法线性回归运算实例攻略 简介 在数据分析和模型建立过程中,直线的最小二乘法线性回归是一个比较常见的算法。在C#中,我们可以使用MathNet库来进行这个运算。 步骤 第一步:安装MathNet库 我们可以在Visual Studio的Nuget包管理器里搜索MathNet库,并安装依赖。 第二步:引入命名空间 在代码文件的头部,我们需要引入…

    C# 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部