C#使用LINQ查询操作符实例代码(二)
目录
- 六、连表操作符
- 1、内连接
- 2、左外连接(DefaultIfEmpty)
- 3、组连接
- 七、集合操作
- 八、分区操作符
- 1、Take():
- 2、TakeWhile():
- 3、Skip():
- 4、SkipWhile():
- 九、聚合操作符
- 1、Count: 返回集合项数。
- 2、LongCount:返回一个 System.Int64,表示序列中的元素的总数量。
- 3、Sum: 序列中的所有数字的和。
- 4、Min: 返回集合中的最小值。
- 5、Max: 返回集合中的最大值。
- 6、Average: 返回集合中的平均值。
- 7、Aggregate: 传递一个 lambda 表达式,该表达式对所有的值进行聚合。
- 十、转换操作符
- 1) Cast:
- 2) ToArray:
- 3) ToList:
- 4) ToDictionary:
- 5) ToLookup:
- 6) DefaultIfEmpty:
- 7) AsEnumerable:
- 十一、生成操作符
- 1) Empty:
- 2) Range:
- 3) Repeat:
- 十二、量词操作符
- 1) Any:
- 2) All:
- 3) Contains:
- 十三、元素操作符
- 十四、并行查询,并行Linq
- 十五、分区器
- 十六、取消
六、连表操作符
1、内连接
1、使用 join 子句 根据特定的条件合并两个数据源,但之前要获得两个要连接的列表。
业务说明:返回1958到1965年间的车手冠军和车队冠军信息,根据年份关联
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
方法语法:
?
1 2 3 |
|
结果:
Year Champion Constructor Title
1958: Mike Hawthorn Vanwall
1959: Jack Brabham Cooper
1960: Jack Brabham Cooper
1961: Phil Hill Ferrari
1962: Graham Hill BRM
1963: Jim Clark Lotus
1964: John Surtees Ferrari
1965: Jim Clark Lotus
1966: Jack Brabham Brabham
1967: Denny Hulme Brabham
2、或者合并成一个LINQ 查询
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
方法语法
?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2、左外连接(DefaultIfEmpty)
左外连接返回左边序列中的全部元素,即使它们在右边的序列中并没有匹配的元素。
左外连接用join子句和 DefaultIfEmpty 方法定义。 使用 DefaultIfEmpty 定义其右侧的默认值。
linq只支持左连接,如要右连接,将query和query1调换位置
业务说明:如赛车手比车队设立冠军的年份要早,可能某个年份只有赛车手冠军没有车队冠军,这时候需要左连接查询。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
结果
1950: Nino Farina no constructor championship
1951: Juan Manuel Fangio no constructor championship
1952: Alberto Ascari no constructor championship
1953: Alberto Ascari no constructor championship
1954: Juan Manuel Fangio no constructor championship
1955: Juan Manuel Fangio no constructor championship
1956: Juan Manuel Fangio no constructor championship
1957: Juan Manuel Fangio no constructor championship
1958: Mike Hawthorn Vanwall
1959: Jack Brabham Cooper
3、组连接
左外连接使用了组连接和 into 子句。它有一部分与组连接相同,只不过组连接不适用 DefaultIfEmpty 方法。
使用组连接时,基于键相等对两个两个独立的序列的元素进行关联并对结果进行分组。
常应用于返回“主键对象-外键对象集合”形式的查询。
业务说明:返回1958到1965年间的车手冠军和车队冠军信息,根据年份关联并分组
注意:直接出现在join子句之后的into关键字会被翻译为GroupJoin,而在select或group子句之后的into表示继续一个查询。
?
1 2 3 4 5 6 7 8 9 |
|
方法语法:
?
1 2 3 4 5 6 7 8 |
|
结果:
1950: Nino Farina 0
1952: Alberto Ascari 0
1953: Alberto Ascari 0
1951: Juan Manuel Fangio 0
1954: Juan Manuel Fangio 0
1955: Juan Manuel Fangio 0
1956: Juan Manuel Fangio 0
1957: Juan Manuel Fangio 0
1958: Mike Hawthorn 1
1961: Phil Hill 1
2、join…on…equals…支持多个键关联,可以使用匿名类型来对多个键值进行Join,如下所示:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
七、集合操作
集合操作通过调用实体类的 GetHashCode() 和 Equals() 方法比较对象。 对于自定义比较,可以传递实现 IEqualityComparer接口的对象。
业务说明:获取使用车型”Ferrari”和车型”Mclaren”都获得过车手冠军车手列表
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
结果:
Niki Lauda
- 1) Union:并集,返回两个序列的并集,去掉重复元素。
- 2) Concat:连接,返回两个序列的并集。
- 3) Intersect:交集,返回两个序列中都有的元素,即交集。
- 4) Except:差集,返回只出现在一个序列中的元素,即差集。
示例:合并html开始标签和结束标签
?
1 2 3 4 5 |
|
结果:
A1
B2
C3
- 5) Zip:通过使用指定的委托函数合并两个序列,集合的总个数不变。
示例:
?
1 2 3 4 5 6 7 |
|
- 6) SequenceEqual:判断两个序列是否相等,需要内容及顺序都相等。
八、分区操作符
扩展方法 Take() 和 Skip() 等的分区操作可以用于分页。
添加在查询的“最后”,返回集合的一个子集。
1、Take():
从序列的开头返回指定数量的连续元素。
2、TakeWhile():
只要满足指定的条件,就会返回序列的元素。
从第一个元素开始, 读取Starts小于40的人员列表,只要遇到大于40的元素就立即停止返回。
?
1 2 3 4 5 6 7 8 9 10 |
|
结果:
Alberto Ascari, Italy; starts: 32, wins: 10
Nino Farina, Italy; starts: 33, wins: 5
3、Skip():
跳过序列中指定数量的元素,然后返回剩余的元素。
业务说明:将车手冠军列表按每页5个名字进行分页。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
结果:
Page 0
Fernando Alonso
Mario Andretti
Alberto Ascari
Jack Brabham
Jim Clark
Page 1
Juan Manuel Fangio
Nino Farina
Emerson Fittipaldi
Mika Hakkinen
Mike Hawthorn
4、SkipWhile():
只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。
九、聚合操作符
聚合操作符返回一个值。
1、Count: 返回集合项数。
2、LongCount:返回一个 System.Int64,表示序列中的元素的总数量。
业务说明:下面的Count 方法只返回获得冠军次数超过三次的赛车手,因为同一个查询中需要使用同一个计数超过一次,所以使用let 子句定义了一个变量 numberYear.
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
3、Sum: 序列中的所有数字的和。
业务说明:下面的Sum 方法用于计算一个国家赢得比赛的总次数。
首先根据国家对赛车手分组,再在新创建的匿名类型中,把Wins 属性赋予某个国家赢得比赛的总次数。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
4、Min: 返回集合中的最小值。
5、Max: 返回集合中的最大值。
6、Average: 返回集合中的平均值。
7、Aggregate: 传递一个 lambda 表达式,该表达式对所有的值进行聚合。
业务说明:Aggregate的
第一个参数是算法的种子,即初始值。(可选)
第二个参数是一个表达式,用来对每个元素进行计算(委托第一个参数是累加变量,第二个参数当前项)。
第三个参数是一个表达式,用来对最终结果进行数据转换。
?
1 2 3 4 |
|
十、转换操作符
查询可以推迟到访问数据项时再执行。在迭代中使用查询时,查询会执行。
而使用转换操作符会立即执行查询,把查询结果放在数组、列表或字典中。
LINQ本身支持四种不同的集合生成方式,包含生成数组的ToArray()
、生成列表的ToList
、生成字典集合的ToDictionary
以及生成Lookup<tkey,telement>
类的ToLookup
。
1) Cast:
将非泛型的 IEnumerable 集合元素转换为指定的泛型类型,若类型转换失败则抛出异常。
如果需要在非类型化的集合上(如ArrayList
)使用LINQ 查询,就可以使用Cast 方法。
在下面的例子中,基于Object
类型的ArrayList
集合用Racer对象填充。
?
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2) ToArray:
从 IEnumerable 创建一个数组。
3) ToList:
立即执行查询,从 IEnumerable 创建一个 List。
4) ToDictionary:
根据指定的键选择器函数,从 IEnumerable 创建一个 Dictionary<tkey,tvalue>。
将列表转换为字典:
?
1 2 3 4 5 6 7 8 9 10 11 |
|
5) ToLookup:
根据指定的键选择器函数,从 IEnumerable 创建一个 System.Linq.Lookup。
ToLookup使用比较复杂,Lookup类似于Dictionary,不过,Dictionary每个键只对应一个值,而Lookup则是1:n 的映射。
Lookup没有公共构造函数,而且是不可变的。在创建Lookup之后,不能添加或删除其中的元素或键。(可以将ToLookup 视为GroupBy与ToDictionary的功能合体)
业务说明:将车手冠军按其使用车型进行分组,并显示使用”williams”车型的车手名字。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
6) DefaultIfEmpty:
返回指定序列的元素;如果序列为空,则返回包含类型参数的默认值的单一元素集合 。
?
1 2 3 |
|
7) AsEnumerable:
返回类型为 IEnumerable 。用于处理LINQ to Entities操作远程数据源与本地集合的协作
十一、生成操作符
生成操作符返回一个新的集合。三个生成操作符不是扩展方法,而是返回序列的正常静态方法。
1) Empty:
生成一个具有指定类型参数的空序列 IEnumerable。
Empty() 方法返回一个不返回值的迭代器,用于需要一个集合的参数,可以给参数传递空集合。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
2) Range:
生成指定范围内的整数的序列 IEnumerable。
如需要填充一二范围的数字,此时就应使用 Range() 方法。这个方法第一个参数作为起始值,把第二个参数作为要填充的项数。
?
1 2 3 4 5 6 7 |
|
Range() 方法不返回填充所定义值的集合,与其他方法一样,推迟查询,返回一个 RangeEnumerator。其中用 yield return 语句,来递增值。该结果也可以与其他扩展方法一起用。
?
1 2 3 4 5 6 7 |
|
3) Repeat:
生成包含一个重复值的序列 IEnumerable。
Repeat() 方法 返回一个迭代器,把同一个值重复特定的次数。
?
1 2 3 4 5 6 7 8 9 |
|
十二、量词操作符
如果元素序列满足指定的条件,量词操作符就返回布尔值。
1) Any:
确定序列是否包含任何元素;或确定序列中的任何元素是否都满足条件。
?
1 2 3 4 |
|
2) All:
确定序列中的所有元素是否满足条件。
3) Contains:
确定序列是否包含指定的元素。
十三、元素操作符
这些元素操作符仅返回一个元素,不是IEnumerable。(默认值:值类型默认为0,引用类型默认为null)
业务说明:获取冠军数排名第三的车手冠军
?
1 2 3 4 5 6 |
|
- 1) First:返回序列中的第一个元素;如果是空序列,此方法将引发异常。
- 2) FirstOrDefault:返回序列中的第一个元素;如果是空序列,则返回默认值default(TSource)。
- 3) Last:返回序列的最后一个元素;如果是空序列,此方法将引发异常。
- 4) LastOrDefault:返回序列中的最后一个元素;如果是空序列,则返回默认值default(TSource)。
- 5) Single:返回序列的唯一元素;如果是空序列或序列包含多个元素,此方法将引发异常。
- 6) SingleOrDefault:返回序列中的唯一元素;如果是空序列,则返回默认值default(TSource);如果该序列包含多个元素,此方法将引发异常。
- 7) ElementAt:返回序列中指定索引处的元素,索引从0开始;如果索引超出范围,此方法将引发异常。
- 8) ElementAtOrDefault:返回序列中指定索引处的元素,索引从0开始;如果索引超出范围,则返回默认值default(TSource)。
十四、并行查询,并行Linq
AsParallel() 方法,扩展 IEnumerable 接口,返回 ParallelQuery类,所以正常的集合类可以以平行方式查询。
?
1 |
|
十五、分区器
AsParallel()方法不仅扩展了 IEnumerable 接口,还扩展了 Partitioner 类。通过它,可以影响创建的分区。
手动创建一个分区器
?
1 |
|
十六、取消
.NET 提供一个标准方法,来取消长时间运行的任务,也适用于并行Linq。
要取消长时间运行的查询可以给查询添加WithCancellation() 方法,并传递一个 CancellactionToken令牌作为参数。
CancelllationToken令牌从CancellactionTokenSource类中创建。该查询在单独的线程中运行,在该线程中,捕获一个OperationCanceledException类型的异常。如果取消了查询就触发这个异常。
在主线程中,调用CancellationTokenSource类的Cancel()方法可以取消任务。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
相关文章:
C#使用LINQ查询操作符实例代码(二)
目录 六、连表操作符 1、内连接2、左外连接(DefaultIfEmpty)3、组连接七、集合操作 八、分区操作符 1、Take():2、TakeWhile():3、Skip():4、SkipWhile():九、聚合操作符 1、Count: 返回集合项数。 2、LongCount&…...
jenkinsfile小试牛刀
序 本文主要演示一下如何用jenkinsfile来编译java服务 安装jenkins 这里使用docker来安装jenkins docker run --name jenkins-docker \ --volume $HOME/jenkins_home:/var/jenkins_home \ -p 8080:8080 jenkins/jenkins:2.416之后访问http://${yourip}:8080,然后…...
C++ xmake构建
文章目录 一、xmake.lua二、xmake常用语句 一、xmake.lua --xmake.luaset_project("XXX")add_rules("mode.debug", "mode.release") set_config("arch", "x64")if is_plat("windows") then -- the release modei…...

推荐带500创作模型的付费创作V2.1.0独立版系统源码
ChatGPT 付费创作系统 V2.1.0 提供最新的对应版本小程序端,上一版本增加了 PC 端绘画功能, 绘画功能采用其他绘画接口 – 意间 AI,本版新增了百度文心一言接口。 后台一些小细节的优化及一些小 BUG 的处理,前端进行了些小细节优…...

wps图表怎么改横纵坐标,MLP 多层感知器和CNN卷积神经网络区别
目录 wps表格横纵坐标轴怎么设置? MLP (Multilayer Perceptron) 多层感知器 CNN (Convolutional Neural Network) 卷积神经网络 多层感知器MLP,全连接网络,DNN三者的关系 wps表格横纵坐标轴怎么设置? 1、打开表格点击图的右侧…...
rdb和aof
RDB持久化:原理是将Redis在内存中的数据库记录定时dump到磁盘上的RDB持久化AOF持久化:原理是将Redis的操作日志以追加的方式写入文件 rdb: 开启方式:客户端可以通过向Redis服务器发送save或bgsave命令让服务器生成rdb文件&#…...

TCP网络通信编程之网络上传文件
【图片】 【思路解析】 【客户端代码】 import java.io.*; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException;/*** ProjectName: Study* FileName: TCPFileUploadClient* author:HWJ* Data: 2023/7/29 18:44*/ public class TCPFil…...

Java中对Redis的常用操作
目录 数据类型五种常用数据类型介绍各种数据类型特点 常用命令字符串操作命令哈希操作命令列表操作命令集合操作命令有序集合操作命令通用命令 在Java中操作RedisRedis的Java客户端Spring Data Redis使用方式介绍环境搭建配置Redis数据源编写配置类,创建RedisTempla…...

链路追踪设计
...

Golang之路---02 基础语法——常量 (包括特殊常量iota)
常量 //显式类型定义const a string "test" //隐式类型定义const b 20 //多个常量定义 const(c "test2"d 2.3e 27)iota iota是Golang语言的常量计数器,只能在常量表达式中使用 iota在const关键字出现时将被重置为0,const中每新…...

Pytest学习教程_装饰器(二)
前言 pytest装饰器是在使用 pytest 测试框架时用于扩展测试功能的特殊注解或修饰符。使用装饰器可以为测试函数提供额外的功能或行为。 以下是 pytest 装饰器的一些常见用法和用途: 装饰器作用pytest.fixture用于定义测试用例的前置条件和后置操作。可以创建可重…...

redis的如何使用
1、redis的使用 1.1windows安装 安装包下载地址:Releases dmajkic/redis GitHub 1.2 redis中常使用的几个文件 1.3 redis中运行 双击redis-server,既可以运行。 1.4使用redis客户单来连接redis 1.5redis的常用指标 redis-serve 服务端,端口号&am…...

MyBatis(二)
文章目录 一.MyBatis的模式开发1.1 定义数据表和实体类1.2 配置数据源和MyBatis1.3 编写Mapper接口和增加xxxMapper.xml1.4 测试我们功能的是否实现. 二. Mybatis的增删查改操作2.1 单表查询2.2 多表查询三.动态SQL的实现3.1 什么是动态SQL3.2 动态SQL的使用if标签的使用trim标…...

【【51单片机AD转换模块】】
代码是简单的,板子是坏的,电阻是识别不出来的 main.c #include <REGX52.H> #include "delay.h" #include "LCD1602.h" #include "XPT2046.h"unsigned int ADValue;void main(void) {LCD_Init();LCD_ShowString(1,1…...
Longest Divisors Interval(cf)
题意:给定一个正整数n,求正整数的区间[l,r]的最大大小,使得对于区间中的每个i(即l≤i≤r),n是i的倍数。给定两个整数l≤r,区间[l,r]的大小为r−l1(即…...
配置文件、request对象请求方法、Django连接MySQL、Django中的ORM、ORM增删改查字段、ORM增删改查数据
一、配置文件的介绍 1.注册应用的 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,app01.apps.App01Config, ]################中间件###############…...

CTF学习路线指南(附刷题练习网址)
前言: PWN,Reverse:偏重对汇编,逆向的理解; Gypto:偏重对数学,算法的深入学习; Web:偏重对技巧沉淀,快速搜索能力的挑战; Mic:则更为复杂&…...
【Rust 基础篇】Rust默认泛型参数:简化泛型使用
导言 Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。在Rust中,泛型是一种非常重要的特性,它允许我们编写一种可以在多种数据类型上进行抽象的代码。然而&…...

从源码分析Handler面试问题
Handler 老生常谈的问题了,非常建议看一下Handler 的源码。刚入行的时候,大佬们就说 阅读源码 是进步很快的方式。 Handler的基本原理 Handler 的 重要组成部分 Message 消息MessageQueue 消息队列Lopper 负责处理MessageQueue中的消息 消息是如何添加…...
shell编程 变量作用域
变量 变量赋值不用$,访问值时用$,赋值时两边不留空格,双引号括起来的变量被值替换{}标记变量开始和结束,变量名区分大小写,所有bash变量的值变量不区分类型,统一为字符串 变量类型 环境变量,子进程可以继承父进程环境…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...