在 C# 中编写 LINQ 查询

  C# 中编写 LINQ 查询的三种方式:

  • 使用查询语法。
  • 使用方法语法。
  • 组合使用查询语法和方法语法。
  1.       // 查询语法
  2. IEnumerable<int> filteringQuery =
  3. from num in numbers
  4. where num < || num >
  5. select num;
  6.  
  7.       // 方法语法.
  8. IEnumerable<int> largeNumbersQuery = numbers2.Where(c => c > ); 
  1.        //混合语法
  2. int numCount1 =
  3. (from num in numbers1
  4. where num < || num >
  5. select num).Count();
  6.  
  7. // Better: Create a new variable to store
  8. // the method call result
  9. IEnumerable<int> numbersQuery =
  10. from num in numbers1
  11. where num < || num >
  12. select num;
  13.  
  14. int numCount2 = numbersQuery.Count();

  对查询子句的结果使用方法语法。 只需将查询表达式括在括号内,然后应用点运算符并调用此方法。

  通常更好的做法是使用另一个变量(numCount2)来存储方法调用的结果。 这样就不太容易将查询本身与查询结果相混淆。

从方法中返回查询

  任何查询的类型都必须为 IEnumerable 或 IEnumerable<T>,或一种派生类型(如 IQueryable<T>)。 因此,返回查询的方法的任何返回值或 out 参数也必须具有该类型。

  如果某个方法将查询具体化为具体的 List<T> 或 Array 类型,则认为该方法在返回查询结果(而不是查询本身)。 仍然能够编写或修改从方法返回的查询变量。

  1.         // QueryMethhod1 returns a query as its value.
  2. IEnumerable<string> QueryMethod1(ref int[] ints)
  3. {
  4. var intsToStrings = from i in ints
  5. where i >
  6. select i.ToString();
  7. return intsToStrings;
  8. }
  9.  
  10. // QueryMethod2 returns a query as the value of parameter returnQ.
  11. void QueryMethod2(ref int[] ints, out IEnumerable<string> returnQ)
  12. {
  13. var intsToStrings = from i in ints
  14. where i <
  15. select i.ToString();
  16. returnQ = intsToStrings;
  17. }

  查询基本上是一组有关如何检索和组织数据的指令。

  若要执行查询,需要调用它的 GetEnumerator 方法。 当您使用 foreach 循环来循环访问元素时,将执行此调用。

  若要计算查询和存储其结果,而不执行 foreach 循环,请对查询变量调用下列方法之一:

  • ToList<TSource>
  • ToArray<TSource>
  • ToDictionary<TSource, TKey, TElement>
  • ToLookup<TSource, TKey, TElement>

  建议在存储查询结果时,将返回的集合对象分配给一个新变量,如下:

  1.     static List<int> numbers = new List<int>() { , , , , , , , , , , };
  2. static void Main()
  3. {
  4. IEnumerable<int> queryFactorsOfFour =
  5. from num in numbers
  6. where num % ==
  7. select num;
  8.  
  9. // Store the results in a new variable
  10. // without executing a foreach loop.
  11. List<int> factorsofFourList = queryFactorsOfFour.ToList();
  12. }

运行时动态指定谓词筛选器

  • 使用 Contains<TSource> 方法:
  1. var queryNames =
  2. from student in students
  3. let i = student.ID.ToString()
  4. where ids.Contains(i)  //ids is method's parameter
  5. select new { student.LastName, student.ID };
  6.  
  7. foreach (var name in queryNames)
  8. {
  9. Console.WriteLine("{0}: {1}", name.LastName, name.ID);
  10. }
  • 使用 switch 语句进行筛选
  1.     static void QueryByYear(string level)
  2. {
  3. GradeLevel year = (GradeLevel)Convert.ToInt32(level);
  4. IEnumerable<Student> studentQuery = null;
  5. switch (year)
  6. {
  7. case GradeLevel.FirstYear:
  8. studentQuery = from student in students
  9. where student.Year == GradeLevel.FirstYear
  10. select student;
  11. break;
  12. case GradeLevel.SecondYear:
  13. studentQuery = from student in students
  14. where student.Year == GradeLevel.SecondYear
  15. select student;
  16. break;
  17. ……
  18.  
  19. default:
  20. break;
  21. }

参考

  [1]MSDN,在C# 中编写 LINQ 查询

LINQ查询表达式(2) - 在 C# 中编写 LINQ 查询的更多相关文章

  1. 子查询三(在FROM子句中使用子查询)

    FROM子句中使用子查询一般都是返回多行多列,可以将其当作一张数据表 示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc,temp ...

  2. 子查询四(在select子句中使用子查询)

    示例一.查询出每个部门的编号,名称,位置,部门人数,平均工资 SELECT d.deptno,d.dname,d.loc, (SELECT COUNT(empno) FROM emp WHERE em ...

  3. 子查询二(在HAVING子句中使用子查询)

    HAVING子句的主要功能是对分组后的数据进行过滤,如果子查询在HAVING中表示要进行分组过滤,一般返回单行单列的数据 示例一.查询部门编号,人数,平均工资,并且要求这些部门的平均工资高于公司的平均 ...

  4. LINQ之路 5:LINQ查询表达式

    书写LINQ查询时又两种语法可供选择:方法语法(Fluent Syntax)和查询表达式(Query Expression). LINQ方法语法的本质是通过扩展方法和Lambda表达式来创建查询.C# ...

  5. 十五、C# 使用查询表达式的LINQ

    使用查询表达式的LINQ   本章介绍了一种新的语法,查询表达式.   1.查询表达式概述 2.特点:投射  筛选  排序   Let  分组 3.作为方法调用   标准查询运算符所实现的查询在功能上 ...

  6. 查询表达式和LINQ to Objects

    查询表达式实际上是由编译器“预处理”为“普通”的C#代码,接着以完全普通的方式进行编译.这种巧妙的发式将查询集合到了语言中,而无须把语义改得乱七八糟 LINQ的介绍 LINQ中的基础概念 降低两种数据 ...

  7. C#复习笔记(4)--C#3:革新写代码的方式(查询表达式和LINQ to object(下))

    查询表达式和LINQ to object(下) 接下来我们要研究的大部分都会涉及到透明标识符 let子句和透明标识符 let子句不过是引入了一个新的范围变量.他的值是基于其他范围变量的.let 标识符 ...

  8. 认识LINQ的第一步---从查询表达式开始

    学习和使用C#已经有2个月了,在这两个月的学习中,深刻体会到,C#这门语言还真不适合编程初学者学习,因为它是吸取了很多其他语言,不仅是面向对象,还包括函数式语言的很多特性,导致它变成特性大爆炸的语言. ...

  9. LINQ查询表达式---------where子句

    LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...

随机推荐

  1. SpringBoot系列教程web篇之Get请求参数解析姿势汇总

    一般在开发web应用的时候,如果提供http接口,最常见的http请求方式为GET/POST,我们知道这两种请求方式的一个显著区别是GET请求的参数在url中,而post请求可以不在url中:那么一个 ...

  2. 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 ...

  3. 【剑指offer】面试题 20. 表示数值的字符串

    面试题 20. 表示数值的字符串

  4. [转帖]VMware vSphere 6 序列号大全

    VMware vSphere 6 序列号大全 https://blog.csdn.net/sj349781478/article/details/82378244   经过测试ESXI6.5也可以使用 ...

  5. 【Linux】一步一步学Linux——Linux系统目录详解(09)

    目录 00. 目录 01. 文件系统介绍 02. 常用目录介绍 03. /etc目录文件 04. /dev目录文件 05. /usr目录文件 06. /var目录文件 07. /proc 08. 比较 ...

  6. docker深入学习一

    docker是一个客户服务器结构的应用程序,其结构如下所示 其组成部分包括 container容器:是image的运行实例,一般container之间以及container与主机之间是相互隔离的,相当 ...

  7. python之生成器yeild

    python生成器Generator——yield 思考: 首先思考这样一个问题: 创建一个列表,但是内存受限,容量一定是有限的.那么如果创建了一个包含100万个元素的列表,不仅占用很大的存储空间,而 ...

  8. chocolatey install curl and netcat

    chocolatey install curl and netcat 软件仓库 https://chocolatey.org/packages choco install curl choco ins ...

  9. H3C S3600V2 通过CONSOLE配置端口镜像

    前24口为百兆口 对应序号为 Ethernet 1/0/(0~24) 25 26为千兆口 对应序号为 GigabitEthernet 1/0/(25~26) 以下是通过25号千兆口监听1号百兆口的例子 ...

  10. spring boot打包,依赖、配置文件分离,拷贝启动脚本

    一.最终打包的目录结构 二.项目结构 三.开始 1.最终打包的目录,可根据自己需要修改. <properties> <mzservice.path>${project.buil ...