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

相关推荐
间彧10 分钟前
PECS原则在Java集合框架中的具体实现有哪些?举例说明
后端
间彧12 分钟前
Java 泛型擦除详解和项目实战
后端
间彧15 分钟前
在自定义泛型类时,如何正确应用PECS原则来设计API?
后端
间彧16 分钟前
能否详细解释PECS原则及其在项目中的实际应用场景?
后端
武子康41 分钟前
大数据-132 Flink SQL 实战入门 | 3 分钟跑通 Table API + SQL 含 toChangelogStream 新写法
大数据·后端·flink
李辰洋1 小时前
go tools安装
开发语言·后端·golang
wanfeng_091 小时前
go lang
开发语言·后端·golang
绛洞花主敏明1 小时前
go build -tags的其他用法
开发语言·后端·golang
渣哥1 小时前
从代理到切面:Spring AOP 的本质与应用场景解析
javascript·后端·面试
张人玉1 小时前
C#WPF如何实现登录页面跳转
ui·c#·wpf