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 studentsjoin cr in classRooms on s.ClassRoomId equals cr.ClassRoomIdselect 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 studentsjoin cr in classRooms on s.ClassRoomId equals cr.ClassRoomId into joinResultselect 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 students1join cr in classRooms on s.ClassRoomId equals cr.ClassRoomIdselect 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 students1join cr in classRooms on s.ClassRoomId equals cr.ClassRoomId into joinResultselect 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.mzph.cn/news/893540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL8【学习笔记】

第一章前提须知 1.1 需要学什么 Dbeaver 的基本使用SQL 语句&#xff1a;最重要的就是查询&#xff08;在实战的时候&#xff0c;你会发现我们做的绝大部分工作就是 “查询”&#xff09;MySQL 存储过程&#xff08;利用数据库底层提供的语言&#xff0c;去进行业务逻辑的封装…

聊一聊 CSS 样式的导入方式

一、CSS 的导入方式有哪些 1、内联样式&#xff0c;在HTML 元素上使用 style 属性&#xff0c;设置当前标签元素的样式 <p style"color: red;">Hello world!</p>2、嵌入样式表&#xff0c;直接在head标签内使用style标签定义元素样式 <head><st…

【JVM】垃圾收集器详解

你将学到 1. Serial 收集器 2. ParNew 收集器 3. Parallel Scavenge 收集器 4. Serial Old 收集器 5. Parallel Old 收集器 6. CMS 收集器 7. G1 收集器 在 Java 中&#xff0c;垃圾回收&#xff08;GC&#xff09;是自动管理内存的一个重要机制。HotSpot JVM 提供了多种…

前端Vue框架——npm ci与npm install的区别以及package-lock.json文件与package.json的区别

目录 一、npm ci与npm install的区别 &#xff08;一&#xff09;npm ci 的作用 &#xff08;二&#xff09;与 npm install 的区别 二、package-lock.json文件与package.json的区别 1️⃣ package.json 2️⃣ package-lock.json 3️⃣ 区别对比 4️⃣ 使用建议 5️⃣…

项目上线后,是否会进行复盘?

是的&#xff0c;定期复盘在软件测试项目里极为关键&#xff0c;我会按以下步骤开展复盘工作&#xff1a; 复盘周期确定 短期项目&#xff1a;针对周期较短&#xff08;如 1 - 2 个月&#xff09;的项目&#xff0c;会在项目结束后的一周内进行复盘&#xff0c;确保大家对项目…

SOME/IP服务接口

本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟&#xff0c;并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理&#xff0c;并结合实际代码展示 SOME/IP 的使用&#xff0c;旨在自我复习并与大家交流。文中引用了一些例图&#xff0c;但由于未能找到原作…

编写0号中断的处理程序

实验内容、程序清单及运行结果 编写0号中断的处理程序&#xff08;课本实验12&#xff09; 解&#xff1a; assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset do mov ax,0 mov es,ax mov di,200h mov cx,offset doend-offset do ;安装中断例…

Android系统开发(十五):从 60Hz 到 120Hz,多刷新率进化简史

引言 欢迎来到“帧率探索实验室”&#xff01;今天&#xff0c;我们要聊聊 Android 11 中对多种刷新率设备的支持。你可能会问&#xff1a;“这和我写代码有什么关系&#xff1f;”别急&#xff0c;高刷新率不仅仅让屏幕更顺滑&#xff0c;还会直接影响用户体验。想象一下&…

基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

【Arduino】语言参考功能

前言 翻译Arduino 参考处列出的常用函数。文中为了减少篇幅&#xff0c;达到能快速翻到查询的目标&#xff0c;在介绍函数中&#xff0c;对部分内容进行了省略&#xff0c;不会列出函数输入参数类型&#xff0c;以及使用注意事项等等&#xff0c;所以若是首次使用或者是调试时出…

Alibaba Spring Cloud 二 Seata 的详细介绍、使用场景以及集成方法

Seata 是一个开源的分布式事务解决方案&#xff0c;它由阿里巴巴开源&#xff0c;专注于解决微服务架构中的分布式事务问题。它支持高性能的分布式事务处理&#xff0c;提供了多种事务模型&#xff08;AT、TCC、SAGA 和 XA&#xff09;&#xff0c;并与 Spring Boot 和 Spring …

ChatGPT结合Excel辅助学术数据分析详细步骤分享!

目录 一.Excel在学术论文中的作用✔ 二.Excel的提示词✔ 三. 编写 Excel 命令 四. 编写宏 五. 执行复杂的任务 六. 将 ChatGPT 变成有用的 Excel 助手 一.Excel在学术论文中的作用✔ Excel作为一种广泛使用的电子表格软件&#xff0c;在学术论文中可以发挥多种重要作用&a…

flume和kafka整合 flume和kafka为什么一起用?

‌Flume和Kafka一起使用的主要原因是为了实现高效、可靠的数据采集和实时处理。‌‌12 实时流式日志处理的需求 Flume和Kafka结合使用的主要目的是为了完成实时流式的日志处理。Flume负责数据的采集和传输,而Kafka则作为消息缓存队列,能够有效地缓冲数据,防止数据堆积或丢…

国内有哪些著名的CRM系统提供商?

嘿&#xff0c;你有没有想过&#xff0c;在这个信息爆炸的时代里&#xff0c;企业怎么才能更好地管理客户关系呢&#xff1f;答案就是使用高效的CRM系统。今天我就来给大家聊聊那些在国际上非常有名的CRM系统提供商吧。 悟空CRM 首先不得不提的就是悟空CRM了&#xff01;这可…

Linux中的几个基本指令(二)

文章目录 1、cp指令例一&#xff1a;例二&#xff1a;例三&#xff1a;例四&#xff1a;例五&#xff1a; 2、mv 指令例一&#xff1a;例二&#xff1a; 3、cat指令例一&#xff1a; 4、tac指令5、which指令6、date指令时间戳&#xff1a;7、zip指令 今天我们继续学习Linux下的…

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

【Linux】APT 密钥管理迁移指南:有效解决 apt-key 弃用警告

引言 随着 Debian 11 和 Ubuntu 22.04 版本的推出&#xff0c;APT 的密钥管理方式发生了重大的变化。apt-key 命令被正式弃用&#xff0c;新的密钥管理机制要求使用 /etc/apt/keyrings/ 或 /etc/apt/trusted.gpg.d/ 来存储和管理密钥。这一变化对管理员和普通用户来说至关重要…

9. 神经网络(一.神经元模型)

首先&#xff0c;先看一个简化的生物神经元结构&#xff1a; 生物神经元有多种类型&#xff0c;内部也有复杂的结构&#xff0c;但是可以把单个神经元简化为3部分组成&#xff1a; 树突&#xff1a;一个神经元往往有多个树突&#xff0c;用于接收传入的信息。轴突&#xff1a;…

Web 音视频(二)在浏览器中解析视频

前言 浏览器中已经能直接播放视频&#xff0c;为什么还需要手动写代码解析&#xff1f; 因为&#xff0c;某些场景需要对视频进行更细致的处理&#xff0c;比如截取关键帧、提取视频中的文字、人物打码、极低延时播放视频等等。 总之&#xff0c;除了最单纯的视频播放外&…

代码随想录刷题day14(2)|(链表篇)02.07. 链表相交(疑点)

目录 一、链表理论基础 二、链表相交求解思路 三、相关算法题目 四、疑点 一、链表理论基础 代码随想录 二、链表相交求解思路 链表相交时&#xff0c;是结点的位置&#xff0c;也就是指针相同&#xff0c;不是结点的数值相同&#xff1b; 思路&#xff1a;定义两个指针…