当前位置: 首页 > article >正文

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 包含两个代码片段,它们使用 JoinGroupJoin 方法来连接 students1classRooms 两个数据集合。

  1. 使用 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 对象。
  2. 使用查询语法 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 方法来连接 students1classRooms 两个数据集合。

  1. 使用 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 可以处理一对多的关系。结果是一个匿名对象,包含学生信息和匹配的教室数量。
  2. 使用查询语法 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 只能获取匹配的第一个元素。
  • 代码片段展示了如何使用这两种方法来连接数据集合,并创建包含连接信息的新对象。


http://www.kler.cn/a/516790.html

相关文章:

  • HTML根元素<html>的语言属性lang:<html lang=“en“>
  • 【Linux】其他备选高级IO模型
  • Python collections模块中的 OrderedDict
  • 煤矿场景下拖链检测数据集VOC+YOLO格式21407张1类别
  • 探索WPF中的RelativeSource:灵活的资源绑定利器
  • Unity自学之旅04
  • 考研机试:买房子
  • 基于单片机的多功能蓝牙语音智能台灯(论文+源码)
  • C语言-构造数据类型
  • [Qt]系统相关-多线程、线程安全问题以及线程的同步机制
  • Spring Boot/MVC
  • kamailio-5.8.4-centos9编译
  • impala增加字段,hsql查不到数据
  • FastJson很快,有什么用?
  • 8.5 Whisper:解锁语音识别新高度的智能助手
  • 服务器交换区占用量查看
  • 3个基于.Net开发的、开源远程管理工具
  • Nacos 2.5.0 全文详解及配置(并解决WebServerException: Unable to start mbedded Tomcat)
  • Redis高阶4-数据统计
  • Go学习:iota枚举
  • React第二十四章(自定义hooks)
  • 利用 SAM2 模型探测卫星图像中的农田边界
  • 【CES2025】超越界限:ThinkAR推出8小时满电可用的超轻AR眼镜AiLens
  • Formality:时序变换(二)(不可读寄存器移除)
  • C# Interlocked 类使用详解
  • 深度学习|表示学习|卷积神经网络|局部链接是什么?|06