在 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. [07]Go设计模式:过滤器模式(FilterPattern)

    目录 过滤器模式 一.简介 二.代码 三.参考链接 过滤器模式 一.简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使 ...

  2. 运行报错:'_TestResult' object has no attribute 'outputBuffer'

    一.运行main函数,未生成测试报告,报错:'_TestResult' object has no attribute 'outputBuffer' 解决方式: 1.在HTMLTestReportCN ...

  3. TP5 模型CURD

    ThinkPHP5的模型是一种对象-关系映射(Object / Relation Mapping ,简称 ORM)的封装,并且提供了简洁的ActiveRecord实现.一般来说,每个数据表会和一个“模 ...

  4. 07 XML知识点--学习笔记

    1.XML概念:Extensible Markup Language 可扩展标记语言 可扩展:标签都是自定义的. <user> <student> 功能 * 存储数据 1. 配 ...

  5. Charles手机代理设置

      Charles工具 手机 方法/步骤     1.打开Charles   点击Proxy,选择proxy settings,输入端口8888   打开电脑,在cmd中输入ipconfig,查看本地 ...

  6. xorm-Iterate/Count/Rows方法实例

    package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/ ...

  7. Log4J对系统性能的影响

    Log4J对系统性能的影响 主要体现: 1.日志输出的目的地,输出到控制台的速度比输出到文件系统的速度要慢. 2.日志输出格式不一样对性能也会有影响,如简单输出布局(SimpleLayout)比格式化 ...

  8. tkinter学习笔记_06

    12.弹窗 messagebox import tkinter as tk from tkinter import messagebox root = tk.Tk() root.title(" ...

  9. Geoserver 跨域设置

    1.下载跨域jar包jetty-servlets.jar(下载geoserver使用的对应jetty版本——可以查看<Geoserver>\lib下jetty-servlet.jar的版本 ...

  10. 最清晰易懂的Mysql CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP区别

    timestamp数据类型 Mysql数据库中,当字段类型为timestamp(时间戳)时,如果默认值取CURRENT_TIMESTAMP,则在insert一条记录时,此时的值自动设置为系统当前时间, ...