c#中的LINQ

LINQ概述

LINQ(Language Integrated Query , 即“语言集成查询”)。

它的提出就是为了提供一种跨越各种数据源的统一的查询方式。LINQ使对这些数据源进行的操作变得更加简单、方便和易于理解,之前的技术都过于繁琐。

具体教程看这个官方文档就够了:

https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/linq/walkthrough-writing-queries-linq

再补充一个:https://www.cnblogs.com/anding/p/18942909

包含四个组件

  • Linq to Objects:对任何类型的c#内存对象提供查询,比如数组、列表和其它集合类型。
  • Linq to XML组件。(之前用XPath)
  • Linq to SQL组件。(之前用ADO.NET)
  • Linq to DataSet组件。

LINQ的本质:lambda表达式和扩展方法的组合,是对方法的调用

写 linq 查询有两种方式

  • 方法语法:使用标准的方法的调用。这些方法是一组叫做标准查询运算符的方法。注意:返回标量的运算符立即执行,返回集合的在遍历时执行。

  • 查询语法:看上去像sql语句,使用查询表达式形式书写

在一个查询中可以组合两种形式。反正编译器最终会把他们翻译成标准查询运算符即方法调用的形式。

查询表达式

Linq 查询结果一般是延迟执行的,即结果只是一个查询计划,就像你仅仅是组织了一段SQL 查询代码,但是还没有执行。当对查询结果进行遍历(foreach)的时候,才会真的执行查询。这个特点叫延迟执行的查询。

对数据源执行CountMaxAverageFirst 此类查询,是立即执行的,这些类型的查询返回单个值。

要强制立即执行任何查询并缓存其结果,需对查询表达式调用 ToListToArray 方法。

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方法就会返回类型的默认值。

一个健壮的程序,不应该隐藏异常,而是有了异常要及早暴露出来,以避免引起更大的问题。???

分组查询时

image-20211129110641369

联合查询,类似SQL联结两个表进行查询 ,用 join


更新于:2023-04-17

posted @ 2023-04-17 18:16  AI大胜  阅读(231)  评论(0)    收藏  举报