c#中的LINQ
LINQ概述
LINQ(Language Integrated Query , 即“语言集成查询”)。
它的提出就是为了提供一种跨越各种数据源的统一的查询方式。LINQ使对这些数据源进行的操作变得更加简单、方便和易于理解,之前的技术都过于繁琐。
具体教程看这个就够了:
包含四个组件
- Linq to Objects:对任何类型的c#内存对象提供查询,比如数组、列表和其它集合类型。
- Linq to XML组件。(之前用XPath)
- Linq to SQL组件。(之前用ADO.NET)
- Linq to DataSet组件。
LINQ的本质:lambda表达式和扩展方法的组合,是对方法的调用。
写 linq 查询有两种方式
-
方法语法:使用标准的方法的调用。这些方法是一组叫做标准查询运算符的方法。注意:返回标量的运算符立即执行,返回集合的在遍历时执行。
-
查询语法:看上去像sql语句,使用查询表达式形式书写
在一个查询中可以组合两种形式。反正编译器最终会把他们翻译成标准查询运算符即方法调用的形式。
查询表达式
Linq 查询结果一般是延迟执行的,即结果只是一个查询计划,就像你仅仅是组织了一段SQL 查询代码,但是还没有执行。当对查询结果进行遍历(foreach)的时候,才会真的执行查询。这个特点叫延迟执行的查询。
对数据源执行Count
、Max
、Average
和 First
此类查询,是立即执行的,这些类型的查询返回单个值。
要强制立即执行任何查询并缓存其结果,需对查询表达式调用 ToList 或 ToArray 方法。
List<int> numQuery2 = (from num in numbers where (num % 2) == 0 select num).ToList();
如果查询表达式等号左边是(var 变量名)或(IEnumerable<T>
变量名),则查询一直到处理枚举时才会执行;注意,如果枚举被处理多次,查询就会执行多次。
如果查询表达式返回标量,等号左边是(int/string/等 变量名),查询会立即执行,并且把查询结果放在查询变量中。
常用的LINQ 举例
where、Any、Count、orderby、select、groupby,都是常用到。
判断“有没有符合条件的数据”:
- Any
- Count
由于Any只关心“有没有符合条件的数据”,而不关心符合条件的有几条数据,但是Count要计算有几条数据,因此在执行的时候,Any只要遇到一个满足条件的数据就停止继续向后检查数据,但是Count则要一直计算到最后一条才能知道满足条件的数据条数,因此通常用Any实现的效率比用Count实现的更高。如果只是想判断数据是否存在,请使用Any方法。
获取一条数据:
Single
:如果确认有且只有一条满足要求的数据,那么就用Single方法。如果没有满足条件的数据,或者满足条件的数据多于一条,Single方法就会抛出异常。SingleOrDefault
:如果确认最多只有一条满足要求的数据,那么就用SingleOrDefault方法。如果没有满足条件的数据,SingleOrDefault方法就会返回类型的默认值。如果满足条件的数据多于一条,SingleOrDefault方法就会抛出异常。First
:如果满足条件的数据有一条或者多条,First方法就会返回第一条数据;如果没有满足条件的数据,First方法就会抛出异常。FirstOrDefault
:如果满足条件的数据有一条或者多条,FirstOrDefault方法就会返回第一条数据;如果没有满足条件的数据,FirstOrDefault方法就会返回类型的默认值。
一个健壮的程序,不应该隐藏异常,而是有了异常要及早暴露出来,以避免引起更大的问题。???
分组查询时
联合查询,类似SQL联结两个表进行查询 ,用 join
更新于:2023-04-17
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?