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

C#.Net筑基-优雅LINQ的查询艺术

Linq(Language Integrated Query,集成查询语言),顾名思义就是用来查询数据的一种语言(可以看作是一组功能、框架特性的集合)。在.NETFramework3.5(大概2007年)引入C#,用统一的C#语言快速查询各种数据,如数据库、XML文档、对象集合等等。Linq的诞生对 C# 编程领域产生了深远而持久的影响,改变了开发人员对查询的思考方式。

  • 使用简单:统一语法(链式方法语法、类似SQL的查询语法),智能提示。
  • 类型安全:编译时强类型检查,减少运行时错误。
  • 延迟执行,查询本身只是构建了一个表达式,在真正使用的时候(foreach、ToList、查询数据库)才会执行。
  • 支持多种数据源:内存中的集合,以及各种外部数据库。

Linq支持查询任何实现了IEnumerable<T>接口的集合类型,基本上所有集合数据都支持Linq查询。如下示例:大于 5 的偶数,并倒叙排列取前三名

 
//方法链语法
var query = arr.Where(n => n > 5 && n % 2 == 0).OrderByDescending(n => n).Take(3);

01、Linq 基础概括

1.1、Linq语法:链式方法、查询表达式

Linq 有两种语法风格,如下实例代码,一种是常规C#方法调用方式,另外一种是类似SQL的查询表达式。这两种语法其本质是一样的,编译后的中间语言(IL)是一样的,确实仅仅只是语法形式不同而已。

🔸链式方法:就是字面意思,函数式方法调用。这些方法都来自 IEnumerable 接口或 IQueryable 接口的扩展方法,这些方法提供了过滤、聚合、排序等多种查询功能。

🔸查询表达式:查询表达式由一组用类似于 SQL 的声明性语法所编写的子句组成。 每个子句依次包含一个或多个 C# 表达式,而这些表达式可能本身就是查询表达式,或者包含查询表达式。查询表达式必须以 from 子句开头,且必须以 select 或 group 子句结尾。

 
//方法链语法
var query = arr.Where(n => n > 5 && n % 2 == 0).OrderByDescending(n => n).Take(3);
//查询表达式语法,类似数据库SQL语言+C#的语法风格
var query2 = (from n in arr
where n > 5 && n % 2 == 0
orderby n descending
select n).Take(3);
比较链式方法查询表达式(SQL)
特点链式方法调用,函数式编程类似SQL语句,自然语言,容易掌握
语法形式点点点链式方法调用,Where().Select().Order()from开头:from...where...select
常用方法/语法System.Linq 上提供的扩展方法或第三方扩展:Where、OrderBy、Select、Skip、Take、Union仅支持编译器识别的关键字:from、where、orderby、group、join、let、select、into、in、on等
本质System.Linq 提供的扩展方法调用编译为标准查询运算符方法调用,编译结果和链式方法一样
功能完整性完整的Linq功能有些能力没有对应语法(如Max),需要结合链式方法使用

📢 两种编写方式编译后生成的IL代码实际上是一样的,也可以混合使用,因此他们并没有性能差异。

查询表达式并不能实现获取前3个元素,此时就需要两者混合使用,

 
var query = from u in list
where u.Age>14
group u by u.Address into gu
orderby gu.Count() descending
select (gu.Key,gu.Count());
query = query.Take(3);

1.2、Linq执行:本地查询、解释型查询

LINQ 提供了两种用途的架构:针对本地(内存)对象的本地查询,以及针对远程数据源(数据库)的解释性查询。两者的语法形式基本一样,都支持链式方法、查询表达式。

🔸本地查询:实现了针对IEnumerable的内存集合(数组、List)的查询,其Linq的扩展方法都在 System.Linq.Enumerable 类中。查询只是构建了一个可枚举的迭代装饰器序列,延迟在使用(消费)数据时执行。

🔸解释查询:解释查询是描述性的,实现了针对IQueryable(Table、DbSet)的远程数据查询,对应扩展方法都在 System.Linq.Queryable 类中。他们在运行时生成表达式树,并进行解释为SQL语句,在数据库中执行该SQL语句并获取数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/259022.html

相关文章:

  • 批量DWG转PDF工具
  • 第⼀个与⼤模型交互的应⽤
  • GBDT:梯度提升决策树——集成学习中的预测利器
  • 每日AI资讯速递 | 2025-06-25
  • Odoo OWL 前端开发:ORM 与 RPC 服务的选择
  • DAY 42 Grad-CAM与Hook函数
  • Spring Boot中日志管理与异常处理
  • flex布局实例:把色子放进盒子里
  • 資訊安全 (Information Security)3大 “CIA“要素
  • Jenkins X + AI:重塑云原生时代的持续交付范式
  • 【151】基于Springboot+Vue实现的校园订餐管理系统小程序(有文档+PPT+视频)
  • 小程序快速获取url link方法,短信里面快速打开链接
  • 基于springboot+vue的智慧农业专家远程指导系统
  • DeepSeek+WinForm串口通讯实战
  • Nginx + Tomcat 负载均衡搭建
  • 云计算产业链
  • 文档处理控件Aspose.Words教程:在.NET中将多页文档转换为单个图像
  • 回归预测 | Matlab实现KAN神经网络多输入单输出回归预测模型
  • [LVGL] 刷新率优化
  • 入门级STM32F103C8T6无人机遥控(原理图)
  • 一步部署APache编译安装脚本
  • 设备维修全流程记录,提升设备运维效率
  • django request.data.get 判断有没有 某个参数
  • 日本生活:日语语言学校-日语作文-沟通无国界(5)-题目:我的一天
  • 【MCP服务】蓝耘元生代 | MCP平台:部署时间服务器MCP,开启大模型交互新体验
  • 理论加案例,一文读懂数据分析中的分类建模
  • [架构之美]Redis客户端命令指南
  • 在树莓派上用 .NET8.0 挂载TCP服务端
  • vscode管理go多个版本
  • 测试平台ui自动化demo说明