C# LINQ使用介绍
LINQ(Language-Integrated Query)是C#语言的一个强大特性,它允许开发者用声明性的方式查询和操作数据。LINQ提供了一致的查询体验,无论是操作内存中的对象(如数组或集合),还是操作外部数据源(如数据库、XML文档或远程服务)。它内置于.NET Framework中,并且可以与任何实现了IEnumerable接口的数据集合一起使用。
LINQ的主要特性:
-
查询语法:LINQ提供了类似于SQL的查询语法,允许开发者以几乎相同的方式对不同类型的数据源进行查询。
-
强类型:LINQ是强类型的,这意味着在编译时就可以检查类型错误。
-
延迟执行:LINQ查询通常是延迟执行的,也就是说,查询表达式本身不会立即执行,直到你迭代结果时才会执行。
-
支持多种数据源:LINQ可以用于查询多种数据源,如LINQ to Objects、LINQ to XML、LINQ to SQL、LINQ to Entities(Entity Framework)等。
LINQ的查询方式:
-
查询表达式:这种方式看起来很像SQL语句,使用
from、where、select、orderby等关键字。var query = from p in peoplewhere p.LastName == "Doe"orderby p.FirstNameselect p; -
方法链:也称为扩展方法语法,使用点号
.和一系列扩展方法来构建查询。var query = people.Where(p => p.LastName == "Doe").OrderBy(p => p.FirstName).Select(p => p);
LINQ查询操作的例子:
假设有一个Person对象的列表,你可以使用LINQ来进行各种查询:
List<Person> people = GetPeople(); // 假设这个方法返回人员列表// 使用查询表达式语法获取姓氏为"Doe"的所有人员
var result = from person in peoplewhere person.LastName == "Doe"select person;// 使用方法链语法做同样的查询
var result = people.Where(person => person.LastName == "Doe");// 按名字排序
var sortedPeople = people.OrderBy(person => person.FirstName);// 获取第一个名字以"J"开头的人
var personWithJ = people.FirstOrDefault(person => person.FirstName.StartsWith("J"));// 检查是否存在任何姓氏为"Doe"的人
bool anyDoe = people.Any(person => person.LastName == "Doe");// 计算姓氏为"Doe"的人的数量
int countDoe = people.Count(person => person.LastName == "Doe");
LINQ不仅仅限于简单的过滤和选择操作,它还支持分组、联接、聚合等复杂操作。LINQ的这种功能丰富性和灵活性使得它成为C#中处理数据的强大工具。
以下是一些高级用法的例子:
分组(Grouping)
使用group关键字可以将数据集合中的项按照某个键分组。这在你需要按照某个属性将数据分批处理时非常有用。
var groupedResult = from p in peoplegroup p by p.LastName into gselect new { LastName = g.Key, Persons = g };// 使用方法语法
var groupedResult = people.GroupBy(p => p.LastName).Select(g => new { LastName = g.Key, Persons = g });
在上面的例子中,people集合被按照LastName属性分组。结果是一个新的集合,每个元素都包含一个键(LastName)和一个子集合(Persons)。
联接(Joining)
LINQ允许你使用join操作符来联接两个序列的元素,基于匹配的键。
var joinQuery = from p in peoplejoin o in orders on p.ID equals o.PersonIDselect new { p.FirstName, p.LastName, o.OrderNumber };// 使用方法语法
var joinQuery = people.Join(orders,person => person.ID,order => order.PersonID,(person, order) => new { person.FirstName, person.LastName, order.OrderNumber });
在这个例子中,people和orders两个集合基于人的ID属性和订单的PersonID属性被联接在一起。
左外联接(Left Outer Join)
左外联接与内联接不同,即使在右侧的序列中没有匹配项,左侧序列的每个元素也会返回。在LINQ中,你可以使用DefaultIfEmpty方法来实现左外联接。
var leftOuterJoinQuery = from p in peoplejoin o in orders on p.ID equals o.PersonID into pofrom suborder in po.DefaultIfEmpty()select new { p.FirstName, p.LastName, OrderNumber = suborder?.OrderNumber ?? "No order" };// 使用方法语法
var leftOuterJoinQuery = people.GroupJoin(orders,person => person.ID,order => order.PersonID,(person, orders) => new { person, orders }).SelectMany(z => z.orders.DefaultIfEmpty(),(person, order) => new { person.person.FirstName, person.person.LastName, OrderNumber = order?.OrderNumber ?? "No order" });
这里,即使某个人没有任何订单,也会在结果中返回该人的信息,同时显示“没有订单”。
聚合(Aggregation)
LINQ提供了多种聚合操作,如Sum、Count、Min、Max和Average。这些可以直接在集合上调用,也可以在分组操作后调用。
// 计算所有订单的总金额
var totalAmount = orders.Sum(o => o.Amount);// 获取每个人的订单数量
var orderCounts = from p in peoplejoin o in orders on p.ID equals o.PersonID into gselect new { p.FirstName, p.LastName, OrderCount = g.Count() };// 使用方法语法
var orderCounts = people.GroupJoin(orders,person => person.ID,order => order.PersonID,(person, orders) => new { person.FirstName, person.LastName, OrderCount = orders.Count() });
在这些例子中,你可以看到如何计算总金额,以及如何联接两个集合以获取每个人的订单数量。
通过使用这些高级操作,你可以构建复杂的查询来处理和分析数据。LINQ的这些功能极大地简化了在.NET中的数据操作。
相关文章:
C# LINQ使用介绍
LINQ(Language-Integrated Query)是C#语言的一个强大特性,它允许开发者用声明性的方式查询和操作数据。LINQ提供了一致的查询体验,无论是操作内存中的对象(如数组或集合),还是操作外部数据源&am…...
【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑
作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢,但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期,负数,const成员)c中重载输入cin和输…...
开源与闭源:大模型时代的技术交融与商业平衡
一、开源和闭源的优劣势比较 1.1 开源 优势: 1.技术共享与吸引人才: 开源促进了技术共享,吸引了全球范围内的人才参与大模型的发展,形成了庞大的开发者社区。 2.推动创新: 开源模式鼓励开发者共同参与,推动…...
C#开发的OpenRA游戏之属性BodyOrientation(6)
C#开发的OpenRA游戏之属性BodyOrientation(6) 在顶层定义里会发现这个属性: ^SpriteActor: BodyOrientation: QuantizeFacingsFromSequence: RenderSprites: SpriteActor是用来定义角色的基本属性,它的第一个属性就是BodyOrientation,这个属性主要用来描述角色的身体的…...
Linux shell编程学习笔记27:tputs
除了stty命令,我们还可以使用tput命令来更改终端的参数和功能。 1 tput 命令的功能 tput 命令的主要功能有:移动更改光标、更改文本显示属性(如颜色、下划线、粗体),清除屏幕特定区域等。 2 tput 命令格式 tput [选…...
【计算机网络笔记】IPv6简介
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
c语言-数据结构-堆
目录 一、二叉树 1、二叉树的概念 2、完全二叉树和满二叉树 3、完全二叉树的顺序存储 二、堆 2、堆的概念与结构 3、堆的创建及初始化 4、堆的插入(小堆) 5、堆的删除 6、显示堆顶元素 7、显示堆里的元素个数 8、测试堆的各个功能 9、 实现堆…...
ROS基础—关于参数服务器的操作
1、rosparam list 获取参数服务器的所有参数。 2、rosparam get /run_id 获取参数的值...
Sql Server 2017主从配置之:事务日志传送
使用事务日志传送模式搭建Sql Server 2017主从同步,该模式有一定的延迟,是通过3个不同的定时任务,将主库的日志同步到从库进行恢复来实现数据库同步操作。 环境准备 两台服务器,配置都是8g2核,50g硬盘,操…...
每日OJ题_算法_双指针_力扣283. 移动零+力扣1089. 复写零
力扣283. 移动零 283. 移动零 - 力扣(LeetCode) 难度 简单 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例…...
WebGl-Blender:建模 / 想象成形 / Blender概念词汇表 / 快捷键
一、理解Blender 欢迎来到Blender!Blender是一款免费开源的3D创作套件。 使用Blender,您可以创建3D可视化效果,例如建模、静态图像,3D动画,VFX(视觉特效)快照和视频编辑。它非常适合那些受益于…...
【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移…...
WPF实现右键菜单
在WPF中,创建上下文菜单(通常称为“右键菜单”)是通过使用ContextMenu控件来实现的。你可以在XAML中声明上下文菜单,并将其关联到任何FrameworkElement。以下是如何在WPF中实现上下文菜单的基本步骤: 1. 在XAML中定义…...
Java智慧工地SaaS管理平台源码:AI/云计算/物联网
智慧工地是指运用信息化手段,围绕施工过程管理,建立互联协同、智能生产、科学管理的施工项目信息化生态圈,并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析,提供过程趋势预测及专家预案,实现工程…...
【漏洞复现】通达oa 前台sql注入
漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…...
机器学习笔记 - Ocr识别中的文本检测EAST网络概述
一、文本检测 文本检测简单来说就是找到图像中可以出现文本的区域。例如,请参见下图,其中在检测到的文本周围绘制了绿色边框。 在进行文本检测时,你可能会遇到两种情况 具有结构化文本的图像:这是指具有干净/均匀背景和常规字体的图像。文本大多密集,行结构正确,…...
【SQL server】数据库、数据表的创建
创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…...
vue的生命周期分别是什么?
Vue的生命周期分为8个阶段,分别是: beforeCreate:实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 created:实例已经创建完成后被调用,这时候实例已完成以下的配置&#…...
Java拼图游戏
运行出的游戏界面如下: 按住A不松开,显示完整图片;松开A显示随机打乱的图片。 User类 package domain;/*** ClassName: User* Author: Kox* Data: 2023/2/2* Sketch:*/ public class User {private String username;private String password…...
Vue框架的element组件table文字居中
1.直接上代码 <el-table max-height"500px" :data"datas.roles" style"width: 100%" border :header-cell-style"{textAlign: center}" :cell-style"{ textAlign: center }"><el-table-column prop"id" …...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
