LINQ查询表达式(2) - 在 C# 中编写 LINQ 查询
在 C# 中编写 LINQ 查询
C# 中编写 LINQ 查询的三种方式:
- 使用查询语法。
- 使用方法语法。
- 组合使用查询语法和方法语法。
- // 查询语法
- IEnumerable<int> filteringQuery =
- from num in numbers
- where num < || num >
- select num;
- // 方法语法.
- IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > );
- //混合语法
- int numCount1 =
- (from num in numbers1
- where num < || num >
- select num).Count();
- // Better: Create a new variable to store
- // the method call result
- IEnumerable<int> numbersQuery =
- from num in numbers1
- where num < || num >
- select num;
- int numCount2 = numbersQuery.Count();
对查询子句的结果使用方法语法。 只需将查询表达式括在括号内,然后应用点运算符并调用此方法。
通常更好的做法是使用另一个变量(numCount2)来存储方法调用的结果。 这样就不太容易将查询本身与查询结果相混淆。
从方法中返回查询
任何查询的类型都必须为 IEnumerable 或 IEnumerable<T>,或一种派生类型(如 IQueryable<T>)。 因此,返回查询的方法的任何返回值或 out 参数也必须具有该类型。
如果某个方法将查询具体化为具体的 List<T> 或 Array 类型,则认为该方法在返回查询结果(而不是查询本身)。 仍然能够编写或修改从方法返回的查询变量。
- // QueryMethhod1 returns a query as its value.
- IEnumerable<string> QueryMethod1(ref int[] ints)
- {
- var intsToStrings = from i in ints
- where i >
- select i.ToString();
- return intsToStrings;
- }
- // QueryMethod2 returns a query as the value of parameter returnQ.
- void QueryMethod2(ref int[] ints, out IEnumerable<string> returnQ)
- {
- var intsToStrings = from i in ints
- where i <
- select i.ToString();
- returnQ = intsToStrings;
- }
查询基本上是一组有关如何检索和组织数据的指令。
若要执行查询,需要调用它的 GetEnumerator 方法。 当您使用 foreach 循环来循环访问元素时,将执行此调用。
若要计算查询和存储其结果,而不执行 foreach 循环,请对查询变量调用下列方法之一:
- ToList<TSource>
- ToArray<TSource>
- ToDictionary<TSource, TKey, TElement>
- ToLookup<TSource, TKey, TElement>
建议在存储查询结果时,将返回的集合对象分配给一个新变量,如下:
- static List<int> numbers = new List<int>() { , , , , , , , , , , };
- static void Main()
- {
- IEnumerable<int> queryFactorsOfFour =
- from num in numbers
- where num % ==
- select num;
- // Store the results in a new variable
- // without executing a foreach loop.
- List<int> factorsofFourList = queryFactorsOfFour.ToList();
- }
运行时动态指定谓词筛选器
- 使用 Contains<TSource> 方法:
- var queryNames =
- from student in students
- let i = student.ID.ToString()
- where ids.Contains(i) //ids is method's parameter
- select new { student.LastName, student.ID };
- foreach (var name in queryNames)
- {
- Console.WriteLine("{0}: {1}", name.LastName, name.ID);
- }
- 使用 switch 语句进行筛选
- static void QueryByYear(string level)
- {
- GradeLevel year = (GradeLevel)Convert.ToInt32(level);
- IEnumerable<Student> studentQuery = null;
- switch (year)
- {
- case GradeLevel.FirstYear:
- studentQuery = from student in students
- where student.Year == GradeLevel.FirstYear
- select student;
- break;
- case GradeLevel.SecondYear:
- studentQuery = from student in students
- where student.Year == GradeLevel.SecondYear
- select student;
- break;
- ……
- default:
- break;
- }
参考
[1]MSDN,在C# 中编写 LINQ 查询
LINQ查询表达式(2) - 在 C# 中编写 LINQ 查询的更多相关文章
- 子查询三(在FROM子句中使用子查询)
FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表 示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc,temp ...
- 子查询四(在select子句中使用子查询)
示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc, (SELECT COUNT(empno) FROM emp WHERE em ...
- 子查询二(在HAVING子句中使用子查询)
HAVING子句的主要功能是对分组后的数据进行过滤,如果子查询在HAVING中表示要进行分组过滤,一般返回单行单列的数据 示例一.查询部门编号,人数,平均工资,并且要求这些部门的平均工资高于公司的平均 ...
- LINQ之路 5:LINQ查询表达式
书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...
- 十五、C# 使用查询表达式的LINQ
使用查询表达式的LINQ 本章介绍了一种新的语法,查询表达式. 1.查询表达式概述 2.特点:投射 筛选 排序 Let 分组 3.作为方法调用 标准查询运算符所实现的查询在功能上 ...
- 查询表达式和LINQ to Objects
查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据 ...
- C#复习笔记(4)--C#3:革新写代码的方式(查询表达式和LINQ to object(下))
查询表达式和LINQ to object(下) 接下来我们要研究的大部分都会涉及到透明标识符 let子句和透明标识符 let子句不过是引入了一个新的范围变量.他的值是基于其他范围变量的.let 标识符 ...
- 认识LINQ的第一步---从查询表达式开始
学习和使用C#已经有2个月了,在这两个月的学习中,深刻体会到,C#这门语言还真不适合编程初学者学习,因为它是吸取了很多其他语言,不仅是面向对象,还包括函数式语言的很多特性,导致它变成特性大爆炸的语言. ...
- LINQ查询表达式---------where子句
LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...
随机推荐
- SpringBoot系列教程web篇之Get请求参数解析姿势汇总
一般在开发web应用的时候,如果提供http接口,最常见的http请求方式为GET/POST,我们知道这两种请求方式的一个显著区别是GET请求的参数在url中,而post请求可以不在url中:那么一个 ...
- Spell It Right
Given a non-negative integer N, your task is to compute the sum of all the digits of N, and output e ...
- 【剑指offer】面试题 20. 表示数值的字符串
面试题 20. 表示数值的字符串
- [转帖]VMware vSphere 6 序列号大全
VMware vSphere 6 序列号大全 https://blog.csdn.net/sj349781478/article/details/82378244 经过测试ESXI6.5也可以使用 ...
- 【Linux】一步一步学Linux——Linux系统目录详解(09)
目录 00. 目录 01. 文件系统介绍 02. 常用目录介绍 03. /etc目录文件 04. /dev目录文件 05. /usr目录文件 06. /var目录文件 07. /proc 08. 比较 ...
- docker深入学习一
docker是一个客户服务器结构的应用程序,其结构如下所示 其组成部分包括 container容器:是image的运行实例,一般container之间以及container与主机之间是相互隔离的,相当 ...
- python之生成器yeild
python生成器Generator——yield 思考: 首先思考这样一个问题: 创建一个列表,但是内存受限,容量一定是有限的.那么如果创建了一个包含100万个元素的列表,不仅占用很大的存储空间,而 ...
- chocolatey install curl and netcat
chocolatey install curl and netcat 软件仓库 https://chocolatey.org/packages choco install curl choco ins ...
- H3C S3600V2 通过CONSOLE配置端口镜像
前24口为百兆口 对应序号为 Ethernet 1/0/(0~24) 25 26为千兆口 对应序号为 GigabitEthernet 1/0/(25~26) 以下是通过25号千兆口监听1号百兆口的例子 ...
- spring boot打包,依赖、配置文件分离,拷贝启动脚本
一.最终打包的目录结构 二.项目结构 三.开始 1.最终打包的目录,可根据自己需要修改. <properties> <mzservice.path>${project.buil ...