在C#中,LINQ(Language Integrated Query)提供了多种连接操作,类似于SQL中的JOIN操作。常见的连接操作包括内连接 、左连接 、右连接 和全外连接。以下是这些连接操作的示例。
1. 内连接(INNER JOIN)
内连接返回两个集合中满足连接条件的元素。
查询语法
示例:
假设有两个集合:Students
和 Courses
,我们想查询学生和他们所选的课程。
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
方法。 - 左连接 :使用
GroupJoin
和DefaultIfEmpty
。 - 右连接:通过交换左连接的集合实现。
- 全外连接:通过组合左连接和右连接实现。
- 交叉连接 :使用
SelectMany
或嵌套from
子句。
这些连接操作可以帮助你在LINQ中实现复杂的查询逻辑,类似于SQL中的JOIN操作。