在 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 查询的更多相关文章

  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. 对get post等http请求方式的理解

    本文是关于get,post等几种请求方式的资料搜集和学习,HTTP,HTTP2协议的涉及点,然后提到了socket协议,RPC 先是和朋友的一些交流对话,问着问着就到了我的知识盲区.需要恶补一下这方面 ...

  2. jQuery “没有属性”选择器

    可以使用.not() 或 :not() 选择器. $('.container:not([data-timestamp])') 或者 $('.container').not('[data-timesta ...

  3. matlab调试时子函数断点不起作用

    matlab调试代码时总是遇到这样一个奇怪的问题,就是当我在主程序(.m脚本)中调用子函数并在子函数中设置断点,然后开始调试运行主程序... 发现主程序直接运行到结束而并没有在调用子函数的时候在所设置 ...

  4. LeetCode 647. 回文子串(Palindromic Substrings)

    647. 回文子串 647. Palindromic Substrings 题目描述 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符 ...

  5. 转载:MFC之MessageBox、AfxMessageBox用法

    在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框. 在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三各方法: .调用API中的MessageBox: ...

  6. 使用Python快速实现简单的人脸检测

    最近有个比较要好的朋友问我能不能从监控视频里识别到从监控跟前经过的指定的人.因为他们单位的监控室经常要花大量的人力跟时间去找某个人在哪个位置出现过的证据.听起来像是一份比较有挑战性的任务,就答应他试试 ...

  7. Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法

    最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...

  8. Java性能调优—— VisualVM工具基本使用及监控本地和远程JVM进程超详细使用教程

  9. 面试4 --- constructor必须与class同名,但方法不能与class同名?

    选 C “constructor必须与class同名,但方法不能与class同名”这句话是错误的,方法是可以和class同名的:方法可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值.

  10. Docker安装带中文全文搜索插件zhparser的Postgresql数据库

    上一篇讲了在已经安装了PG数据库的情况下,安装全文搜索插件zhparser遇到的问题.在一个全新的环境中安装带有全文搜索插件zhparser的PG数据库,可以使用已经做好的Docker镜像,在安装的过 ...