C# 之 LINQ的查询语法

Posted 开发同学留步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 之 LINQ的查询语法相关的知识,希望对你有一定的参考价值。


不点蓝字,我们哪来故事?




C# 之 LINQ的查询语法



1.LINQ的两种语法


写LINQ时有两种形式的语法:

(1)查询语法(query syntax)查询语法是声明形式的,使用查询表达式形式来书写。

(2)方法语法(method syntax)方法语法是命令形式的,它使用的是标准的方法调用。方法是一组叫做标准查询运算符的方法。


微软推荐使用查询语法,因为它更易读,能更清晰的表明查询意图,因此也不容易出错。然而,有一些运算符必须使用方法语法来书写。


所以我们通常在一个查询中可以使用两种方法的组合。查询表达式使用的查询语法会被C#编译器转换为方法调用的形式、这两种形式在运行时性能上没有区别。



2. 查询变量


LINQ查询可以返回两种类型的结果:

(1)可枚举的一组数据,它列出了满足查询参数的项列表;

(2)标量,它是满足查询条件的结果的某种摘要形式。


static void Main(string[] args){  int[] numberArr = new int[] { 100, 90, 80, 70, 60, 50, 40, 30, 20, 10 }; Stopwatch sw1 = new Stopwatch(); sw1.Start(); //在numberArr表中查找大于等于60的元素 IEnumerable<int> numRes = from num in numberArr where num >= 60 select num; foreach (int i in numRes) {          Console.WriteLine(i);     } sw1.Stop();     Console.WriteLine("numCount:" + sw1.Elapsed);

     Stopwatch sw = new Stopwatch();     sw.Start(); int numCount = (from num in numberArr where num >= 60 select num).Count(); Console.WriteLine(numCount); sw.Stop();     Console.WriteLine("numCount:" + sw.Elapsed);      Console.ReadKey(); }

LINQ查询返回两种类型结果的差别还在于查询执行的时间:

(1)如果查询表达式返回可枚举的一组数据,查询一直到处理枚举时才会被执行。如果枚举被处理多次,则查询会被执行多次;如果在进行便利之后,查询执行之前数据有改动,则查询会使用新的数据。

(2)如果查询表达式返回标量,查询立刻执行,并且把结果保存在查询变量中。


3. 查询表达式的结构


1)from子句


from子句指定了要作为数据源使用的数据集合。语法格式如下所示:


from 数据类型 迭代变量 in 要查询的数据源


对from子句的说明如下:

① 迭代变量有序表示数据源的每一个元素;

② 数据类型是集合中元素的类型,数据类型是可选的,因为编译器会从集合来自动推断出迭代变量的类型;

③ 要查询的集合必须是可以枚举的。



2)where子句


where子句根据之后的运算来去除不符合指定条件的项。如下所示是where子句的语法:


where 布尔表达式


where子句将布尔表达式,即谓词,应用于由迭代变量引用的每个源元素,并返回满足指定条件的元素。


使用where子句需注意以下几点:

(1)where子句是一种筛选机制,它不能是查询表达式中的第一个或最后一个子句;

(2)如果where子句中设定的布尔表达式对当前数据源的元素无效,则会发生编译错误;

(3)编译时,where关键字会被转换为where标准查询运算符方法的调用。



3)select子句


select子句指定所选择的对象那部分应该被选择。它可以指定下面的任意一项:

(1)整个数据项

(2)数据项的一个字段

(3)数据项中的几个字段组成的新对象(或类似其他值)


select子句的结果基于前面所有子句的计算结果以及select子

句本身的所有表达式。


查询表达式必须以 select子句或group子句结束。



4)group子句


group子句是可选的,用来指定选定的项如何被分组。使用

group子句的注意事项如下:

(1)如果项包括在查询的结果中,就可以根据某个字段的值进行分组。作为分组依据的项叫做键;

(2)group子句不从原始的数据源中返回可枚举项的枚举类型,而是返回已经形成的可以枚举项的分组的可枚举类型;

(3)分组本身是可枚举类型,它们可以枚举实际的项。


使用示例:


 var Persons = new[] { new { Name = "Czhenya", Sex = "男" }, new { Name = "CZY", Sex = "boy" }, new { Name = "CXY_CZY", Sex = "1" } }; var psoGruop = from pos in Persons group pos by pos.Name; foreach (var item in psoGruop) { Console.WriteLine(item.Key); foreach (var i in item) { Console.WriteLine(i.Name + "..." + i.Sex); }  }


5)orderby子句


orderby子句接受一个表达式并根据表达式依次返回结果项orderby子句的语法如下所示:

orderby 表达式 [ ascending |descending]


不写后缀默认是升序排序方式,

可以有任意多个orderby子句,但是必须使用逗号分割。


var Persons = new[] { new { Name = "Czhenya", Sex = "男", Age = 1 }, new { Name = "CZY", Sex = "boy", Age = 3 }, new { Name = "CXY_CZY", Sex = "1", Age = 2 } };

var shengXu = from pos in Persons orderby pos.Age ascending select pos;foreach (var i in shengXu){ Console.WriteLine(i.Name + "..." + i.Age);}

var jiangXu = from pos in Persons orderby pos.Age descending select pos;foreach (var i in jiangXu){ Console.WriteLine(i.Name + "..." + i.Age);}

上面这个例子使用Age这个字段,也可以使用Name这个字段会根据英文字母排序,若Name有中文也是可以排序的,可以自行尝试下.

以上是关于C# 之 LINQ的查询语法的主要内容,如果未能解决你的问题,请参考以下文章

C# 之 LINQ简析

linq简介

C# 语法 ( linq查询语句 )

简单介绍C#集合查询Linq在项目中使用详解

在 C# 中将 SQL 查询转换为 LINQ 方法语法

使用 LINQ 查询语法 EF Core C# 的左外连接