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日

相关文章

  • .net core 3.1 Redis安装和简单使用

    以下是关于“.NET Core 3.1 Redis安装和简单使用”的完整攻略: 1. Redis 简介 Redis 是一种高性能的键值存储数据库,支持多种数据结构如字符串、哈希、列表、集合和有序集合等。 通常用于缓存、会话管理、消息队列和排行榜等场景。 2. Redis 安装 2.1 Windows 安装 在 Windows 上安装 Redis,可以从 Re…

    C# 2023年5月12日
    00
  • ASP.NET性能优化小结(ASP.NET&C#)

    针对你提出的主题“ASP.NET性能优化小结(ASP.NET&C#)”,我将为你提供一些完整攻略,并附带两个示例,以供参考。 标题 1. 概述 对于一个高效的 ASP.NET 网站,性能优化至关重要。性能优化可以提高网站的访问速度、降低响应时间,缩短页面加载时间,减轻服务器的压力和消耗等。在本文中,我们将分享几个优化网站性能的策略。 2. 启用缓存(…

    C# 2023年5月15日
    00
  • asp实现读取数据库输出json代码

    下面是ASP实现读取数据库输出JSON格式的完整攻略。 第一步:连接数据库 首先,我们需要连接数据库。在ASP中,我们可以使用ADODB库来连接数据库。以下是连接字符串的示例代码: Set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Mic…

    C# 2023年5月31日
    00
  • Silverlight中同步调用WebClient的解决办法,是同步!

    在Silverlight中,WebClient是一个常用的类,用于从Web服务器下载数据。默认情况下,WebClient使用异步方式下载数据,这意味着下载操作将在后台线程中执行,而不会阻塞UI线程。但是,在某些情况下,我们可能需要使用同步方式下载数据,以便在下载完成之前阻塞UI线程。本文将介绍如何在Silverlight中同步调用WebClient,并提供两…

    C# 2023年5月15日
    00
  • c#实现md5加密示例

    下面是“c#实现md5加密示例”的完整攻略: 1. 了解MD5加密算法 首先需要了解什么是MD5加密算法,MD5是一种单向散列函数,可将任意长度的消息字符串通过加密处理后变成一个128位的大整数。MD5算法是将信息通过一次处理过程之后,将结果压缩成固定长度(128位)的输出,也可以理解为将任意长度的消息转换为128位的密文。 2. 在C#中使用MD5算法加密…

    C# 2023年6月7日
    00
  • WinForm实现鼠标拖动控件跟随效果

    为了实现WinForm中的鼠标拖动控件跟随效果,我们需要使用下述步骤: 1. 获取鼠标位置 鼠标在界面上移动时,我们需要获取其当前位置。可以通过下面的代码来获取: private void panel1_MouseMove(object sender, MouseEventArgs e) { Point point = Control.MousePositi…

    C# 2023年6月1日
    00
  • C#在Winform开发中使用Grid++报表

    C#是一种流行的编程语言,可以用于Windows窗体开发。在Winform开发中,Grid++报表是一种流行的报表生成工具,可以方便地生成各种报表。下面是详细的攻略: 准备工作 在使用Grid++报表前,需要先下载并安装Grid++ Report软件。安装完成后,需要将Grid++ Report的.NET程序集引入到项目中,以便使用Grid++ Report…

    C# 2023年6月1日
    00
  • C#用表达式树构建动态查询的方法

    下面是C#用表达式树构建动态查询的完整攻略。 什么是表达式树 表达式树(Expression Tree)是将操作表达式按照层级结构组成的一种数据结构,类似于抽象语法树(AST)。在C#中,表达式树可以动态表示Lambda表达式的结构。 为何要用表达式树构建动态查询 在很多情况下,我们需要设计一个通用的、可扩展的查询条件表达式,比如一个动态搜索框,用户可以在其…

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