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操作。

相关推荐
程序员敲代码吗26 分钟前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
MX_935931 分钟前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子1 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
源代码•宸2 小时前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
缺点内向2 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
晚霞的不甘3 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
喵叔哟3 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_930707783 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
Charlie_lll4 小时前
力扣解题-移动零
后端·算法·leetcode
初级代码游戏4 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放