LINQ 和 LINQ 扩展方法(2)
1.表联接(连接)
Join() 相当于 join on equals 默认是inner join内联系 JoinGroup()是左外联
- 数据关联:
Join
是在数据库查询中常用的操作,用于基于某个共同的键关联两个表。在内存中处理集合时,LINQ的Join
方法提供了相似的功能。 - 数据整合:通过
Join
,可以将学生信息和教室信息整合到一个对象中,便于后续的处理和展示。 - 用法
- 关联数据:当你需要将两个相关联的数据集合(如学生和教室)组合成一个集合时,可以使用
Join
。 - 创建DTO:在处理多层数据关联时,将相关的数据封装到一个DTO中可以简化后续的数据处理逻辑。
2.代码示例
// 1.创建数据集合:
// 代码中没有显示数据集合的定义,但通常你会有两个数据集合,例如 students1 和 classRooms,它们分别存储学生信息和教室信息。
// 定义一个学生列表
List<Student> students = new List<Student>()
{
new Student() {StudentId = 1 ,StudentName = "张三" ,ClassRoomId = 1},
new Student() {StudentId = 2 ,StudentName = "李四" ,ClassRoomId = 2},
new Student() {StudentId = 3 ,StudentName = "王五" ,ClassRoomId= 3},
new Student() {StudentId = 4 ,StudentName = "赵六" ,ClassRoomId = 2},
new Student() {StudentId = 5 ,StudentName = "孙琦" ,ClassRoomId = 3}
};
// 定义一个班级列表
List<ClassRoom> classRooms = new List<ClassRoom>()
{
new ClassRoom() {ClassRoomId = 1,ClassRoomName = "班级1"},
new ClassRoom() {ClassRoomId = 2,ClassRoomName = "班级2"},
new ClassRoom() {ClassRoomId = 3,ClassRoomName = "班级3"}
};
// Join 方法基于两个集合中元素的关联键将它们结合起来。
// 第一个参数 students1 是要进行联合的主数据集合。
// 第二个参数 classRooms 是要联合的次数据集合。
// 第三个参数 s => s.ClassRoomId 是主数据集合中用于匹配的键选择器函数。
// 第四个参数 cr => cr.ClassRoomId 是次数据集合中用于匹配的键选择器函数。
// 最后的参数 (s, cr) => new StudentDTO() 是结果选择器函数,定义了如何从联合的元素创建新的 StudentDTO 对象。
// 1.使用 Join 方法
var result = students.Join(classRooms, s => s.ClassRoomId, cr => cr.ClassRoomId,
(s, cr) =>
new StudentDTO
{
StudentId = s.StudentId,
StudentName = s.StudentName,
ClassRoomId = s.ClassRoomId,
ClassRoomName = cr.ClassRoomName
});
// 2.使用查询语法 join
var result1 = from s in students
join cr in classRooms on s.ClassRoomId equals cr.ClassRoomId
select new StudentDTO()
{
StudentId = s.StudentId,
StudentName = s.StudentName,
ClassRoomId = s.ClassRoomId,
ClassRoomName = cr.ClassRoomName
};
// 3.使用 GroupJoin 方法
var result2 = students.GroupJoin(classRooms, s => s.ClassRoomId, cr => cr.ClassRoomId,
(s, cr) =>
new
{
StudentId = s.StudentId,
StudentName = s.StudentName,
ClassRoomId = s.ClassRoomId,
//ClassRoomName = cr.ClassRoomName // GroupJoin()默认得到右表数量,不能拿右表中的列。
Count = cr.Count()
});
// 4.使用查询语法 join ... into ...
var result3 = from s in students
join cr in classRooms on s.ClassRoomId equals cr.ClassRoomId into joinResult
select new
{
StudentId = s.StudentId,
StudentName = s.StudentName,
ClassRoomId = s.ClassRoomId,
Count = joinResult.Count()
};
// 创建一个学生类
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public int ClassRoomId { get; set; }
}
// 创建一个班积类
public class ClassRoom
{
public int ClassRoomId { get; set; }
public string ClassRoomName { get; set; }
}
// 创建StudentDTO对象
// StudentDTO 应该是一个数据传输对象(DTO),用于封装学生和教室信息。
public class StudentDTO
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public int ClassRoomId { get; set; }
public string ClassRoomName { get; set;}
}
3.join 方法 和 groupjoin方法的区别
1.Join方法用于一对一的关系,而GroupJoin方法用于一对多的关系
2.GroupJoin 可以获取与每个元素匹配的所有元素的集合,而Join只能获取匹配的第一个元素
总结:
代码片段展示了如何使用这两种方法来连接数据集合,并创建包含连接信息的新对象
4. 删除数据
这两个文件包含C#代码片段,展示了如何使用LINQ进行数据集合的联合操作。以下是核心内容的整理:
文件 1
文件 1 包含两个代码片段,它们使用 Join
和 GroupJoin
方法来连接 students1
和 classRooms
两个数据集合。
-
使用
Join
方法:var result = students1.Join(classRooms, s => s.ClassRoomId, cr => cr.ClassRoomId, (s, cr) => new StudentDTO() { StudentId = s.StudentId, StudentName = s.StudentName, ClassRoomId = s.ClassRoomId, ClassRoomName = cr.ClassRoomName });
- 这段代码使用
Join
方法将students1
和classRooms
集合根据ClassRoomId
属性进行一对一的匹配,然后创建一个新的StudentDTO
对象。
- 这段代码使用
-
使用查询语法
join
:var sult1 = from s in students1 join cr in classRooms on s.ClassRoomId equals cr.ClassRoomId select new StudentDTO() { StudentId = s.StudentId, StudentName = s.StudentName, ClassRoomId = s.ClassRoomId, ClassRoomName = cr.ClassRoomName };
- 这段代码使用查询语法的
join
来实现与第一个代码片段相同的功能。
- 这段代码使用查询语法的
文件 2
文件 2 包含两个代码片段,使用 GroupJoin
方法来连接 students1
和 classRooms
两个数据集合。
-
使用
GroupJoin
方法:var result2 = students1.GroupJoin(classRooms, s => s.ClassRoomId, cr => cr.ClassRoomId, (s, cr) => new { StudentId = s.StudentId, StudentName = s.StudentName, ClassRoomId = s.ClassRoomId, Count = cr.Count() // GroupJoin() 默认得到右表数量,不能拿右表中的列。 });
- 这段代码使用
GroupJoin
方法将students1
和classRooms
集合根据ClassRoomId
属性进行匹配,但与Join
不同的是,GroupJoin
可以处理一对多的关系。结果是一个匿名对象,包含学生信息和匹配的教室数量。
- 这段代码使用
-
使用查询语法
join ... into ...
:var result3 = from s in students1 join cr in classRooms on s.ClassRoomId equals cr.ClassRoomId into joinResult select new { StudentId = s.StudentId, StudentName = s.StudentName, ClassRoomId = s.ClassRoomId, Count = joinResult.Count() // 这里应该是 joinResult.Count() };
- 这段代码使用查询语法的
join ... into ...
来实现与第一个代码片段相同的功能,但结果选择器中有一个错误(joinRes
应该是joinResult
)。
- 这段代码使用查询语法的
总结
Join
方法用于一对一的关系,而GroupJoin
方法用于一对多的关系。GroupJoin
可以获取与每个元素匹配的所有元素集合,而Join
只能获取匹配的第一个元素。- 代码片段展示了如何使用这两种方法来连接数据集合,并创建包含连接信息的新对象。