C# linq 各种连接方法示例(如左连接,右连接)

在C#中,LINQ(Language Integrated Query)提供了多种连接操作,类似于SQL中的JOIN操作。常见的连接操作包括内连接左连接右连接全外连接。以下是这些连接操作的示例。


1. 内连接(INNER JOIN)

内连接返回两个集合中满足连接条件的元素。

查询语法

示例:

假设有两个集合:StudentsCourses,我们想查询学生和他们所选的课程。

C# 复制代码
var innerJoinQuery = from student in Students
                     join course in Courses
                     on student.CourseId equals course.Id
                     select new
                     {
                         StudentName = student.Name,
                         CourseName = course.Name
                     };

方法语法:

C# 复制代码
var innerJoinQuery = Students
    .Join(Courses,
          student => student.CourseId,
          course => course.Id,
          (student, course) => new
          {
              StudentName = student.Name,
              CourseName = course.Name
          });

2. 左连接(LEFT JOIN)

左连接返回左集合中的所有元素,即使右集合中没有匹配的元素。如果右集合中没有匹配的元素,则返回默认值。

查询语法

示例:

查询所有学生,即使他们没有选课。

C# 复制代码
var leftJoinQuery = from student in Students
                    join course in Courses
                    on student.CourseId equals course.Id into studentCourses
                    from sc in studentCourses.DefaultIfEmpty()
                    select new
                    {
                        StudentName = student.Name,
                        CourseName = sc?.Name ?? "No Course"
                    };

方法语法:

C# 复制代码
var leftJoinQuery = Students
    .GroupJoin(Courses,
               student => student.CourseId,
               course => course.Id,
               (student, courses) => new { student, courses })
    .SelectMany(
        x => x.courses.DefaultIfEmpty(),
        (student, course) => new
        {
            StudentName = student.student.Name,
            CourseName = course?.Name ?? "No Course"
        });

3. 右连接(RIGHT JOIN)

右连接返回右集合中的所有元素,即使左集合中没有匹配的元素。如果左集合中没有匹配的元素,则返回默认值。

LINQ本身没有直接的右连接操作,但可以通过交换左连接中的集合来实现。

查询语法

示例:

查询所有课程,即使没有学生选修。

C# 复制代码
var rightJoinQuery = from course in Courses
                     join student in Students
                     on course.Id equals student.CourseId into courseStudents
                     from cs in courseStudents.DefaultIfEmpty()
                     select new
                     {
                         CourseName = course.Name,
                         StudentName = cs?.Name ?? "No Student"
                     };

方法语法:

C# 复制代码
var rightJoinQuery = Courses
    .GroupJoin(Students,
               course => course.Id,
               student => student.CourseId,
               (course, students) => new { course, students })
    .SelectMany(
        x => x.students.DefaultIfEmpty(),
        (course, student) => new
        {
            CourseName = course.course.Name,
            StudentName = student?.Name ?? "No Student"
        });

4. 全外连接(FULL OUTER JOIN)

全外连接返回左集合和右集合中的所有元素。如果某一边没有匹配的元素,则返回默认值。

LINQ没有直接支持全外连接,但可以通过组合左连接和右连接来实现。

查询语法

示例:

查询所有学生和课程,包括没有选课的学生和没有学生的课程。

c# 复制代码
var leftJoin = from student in Students
               join course in Courses
               on student.CourseId equals course.Id into studentCourses
               from sc in studentCourses.DefaultIfEmpty()
               select new
               {
                   StudentName = student.Name,
                   CourseName = sc?.Name ?? "No Course"
               };

var rightJoin = from course in Courses
                join student in Students
                on course.Id equals student.CourseId into courseStudents
                from cs in courseStudents.DefaultIfEmpty()
                select new
                {
                    StudentName = cs?.Name ?? "No Student",
                    CourseName = course.Name
                };

var fullOuterJoin = leftJoin.Union(rightJoin);

5. 交叉连接(CROSS JOIN)

交叉连接返回两个集合的笛卡尔积,即左集合中的每个元素与右集合中的每个元素组合。

查询语法

示例:

查询所有学生和课程的所有可能组合。

C# 复制代码
var crossJoinQuery = from student in Students
                     from course in Courses
                     select new
                     {
                         StudentName = student.Name,
                         CourseName = course.Name
                     };

方法语法:

C# 复制代码
var crossJoinQuery = Students
    .SelectMany(student => Courses,
                (student, course) => new
                {
                    StudentName = student.Name,
                    CourseName = course.Name
                });

总结

  • 内连接 :使用 join 关键字或 Join 方法。
  • 左连接 :使用 GroupJoinDefaultIfEmpty
  • 右连接:通过交换左连接的集合实现。
  • 全外连接:通过组合左连接和右连接实现。
  • 交叉连接 :使用 SelectMany 或嵌套 from 子句。

这些连接操作可以帮助你在LINQ中实现复杂的查询逻辑,类似于SQL中的JOIN操作。

相关推荐
还听珊瑚海吗2 小时前
基于SpringBoot的抽奖系统测试报告
java·spring boot·后端
XYR1212125 小时前
C# 参数
c#
你怎么知道我是队长5 小时前
Go语言标识符
后端·golang
oMMh6 小时前
使用C# ASP.NET创建一个可以由服务端推送信息至客户端的WEB应用(2)
前端·c#·asp.net
Risehuxyc6 小时前
GrassRoot备份项目
c#
咩咩觉主7 小时前
c#数据结构 线性表篇 非常用线性集合总结
开发语言·数据结构·unity·c#·游戏引擎·程序框架
Kookoos8 小时前
ABP vNext + Dapr 实现云原生微服务治理
微服务·云原生·架构·c#·.net
sco52829 小时前
SpringBoot 自动装配原理 & 自定义一个 starter
java·spring boot·后端
火星papa9 小时前
C# 通过ConfigurationManager读写配置文件App.Config
c#·配置文件·app.config
bicijinlian9 小时前
.Net HttpClient 处理响应数据
c#·.net·httpclient·.net httpclient