写点什么

C#入门系列 (二十八) -- LINQ 的查询语法

作者:陈言必行
  • 2022 年 7 月 23 日
  • 本文字数:2176 字

    阅读完需:约 7 分钟

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 有中文也是可以排序的,可以自行尝试下.




发布于: 21 分钟前阅读数: 6
用户头像

陈言必行

关注

公号:开发同学留步 2019.03.12 加入

我是一个从事Unity游戏开发攻城狮,6年开发经验,助你日常不加班。

评论

发布
暂无评论
C#入门系列(二十八) -- LINQ的查询语法_七月月更_陈言必行_InfoQ写作社区