C#学习笔记(九):LINQ和表达式树
LINQ
LINQ:语言集成查询(Language Integrated Query)是一组用于c#和Visual Basic语言的扩展。它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据。
借助于LINQ技术,我们可以使用一种类似SQL的语法来查询任何形式的数据。目前为止LINQ所支持的数据源有SQL Server、Oracle、XML(标准通用标记语言下的一个应用)以及内存中的数据集合。开发人员也可以使用其提供的扩展框架添加更多的数据源,例如MySQL、Amazon甚至是GoogleDesktop。
起源
.net的设计者在类库中定义了一系列的扩展方法来方便用户操作集合对象,而就是这些扩展方法构成了LINQ的查询操作符。
约束
LINQ的扩展方法都是针对实现IEnumerable接口的对象进行扩展的也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法。
语法
LINQ查询时有两种语法可供选择:查询表达式(Query Expression)和方法语法(Fluent Syntax)。
.NET公共语言运行库(CLR)并不具有查询表达式的概念。所以,编译器会在程序编译时把查询表达式转换为方法语法,即对扩展方法的调用。所以使用方法语法会让我们更加接近和了解LINQ的实现和本质,并且一些查询只能表示为方法调用。但另一方面,查询表达式通常会比较简单和易读。不管怎样,这两种语法是互相补充和兼容的,我们可以在一个查询中混合使用查询表达式和方法语法。
查询关键字
|
子句 |
说明 |
|---|---|
|
指定数据源和范围变量(类似于迭代变量)。 |
|
|
根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或 ||)分隔的布尔表达式筛选源元素。 |
|
|
指定当执行查询时返回的序列中的元素将具有的类型和形式。 |
|
|
按照指定的键值对查询结果进行分组。 |
|
|
提供一个标识符,它可以充当对 join、group 或 select 子句的结果的引用。 |
|
|
基于元素类型的默认比较器按升序或降序对查询结果进行排序。 |
|
|
基于两个指定匹配条件之间的相等比较来联接两个数据源。 |
|
|
引入一个用于存储查询表达式中的子表达式结果的范围变量。 |
|
|
join 子句中的上下文关键字。 |
|
|
join 子句中的上下文关键字。 |
|
|
join 子句中的上下文关键字。 |
|
|
group 子句中的上下文关键字。 |
|
|
orderby 子句中的上下文关键字。 |
|
|
orderby 子句中的上下文关键字。 |
语法示例
下面提供查询表达式(Query Expression)和方法语法(Fluent Syntax)两种示例,实现的效果是取出数组中的偶数。
using System;
using System.Linq; namespace Study
{
class Program
{
private static void Main(string[] args)
{
//定义数据源
int[] nums = {, , , , , , , , , }; //使用查询表达式
var queryResult1 = from num in nums where num % == select num; foreach (int num in queryResult1)
{
Console.Write("{0,1} ", num);
} Console.WriteLine(); //使用方法语法
var queryResult2 = nums.Where(num => num % == ); foreach (int num in queryResult2)
{
Console.Write("{0,1} ", num);
} Console.Read();
}
}
}
使用LINQ操作XML
在C#3.0之前,使用的是System.Xml.XmlDocument来处理XML数据,操作稍显繁琐,下面我们看一个使用LINQ操作XML数据的例子:
using System;
using System.Linq;
using System.Xml.Linq; namespace Study
{
class Program
{
private static string xmlString =
"<Persons>" +
"<Person Id='1'>" +
"<Name>张三</Name>" +
"<Age>18</Age>" +
"</Person>" +
"<Person Id='2'>" +
"<Name>李四</Name>" +
"<Age>28</Age>" +
"</Person>" +
"<Person Id='3'>" +
"<Name>王五</Name>" +
"<Age>38</Age>" +
"</Person>" +
"</Persons>"; private static void Main(string[] args)
{
XElement xmlDoc = XElement.Parse(xmlString); var queryResult = from element in xmlDoc.Elements("Person")
where element.Element("Name").Value == "李四"
select element; foreach (var xElement in queryResult)
{
Console.WriteLine("姓名: " + xElement.Element("Name").Value + ", Id为: " + xElement.Attribute("Id").Value);
} Console.Read();
}
}
}
LINQ的本质
LINQ在我们看来是添加了新的语法和特性,但其实对于编译器而言并没有添加任何新的东西,编写的LINQ查询语句其实在编译后会转变为编译器可以认识的Lambda表达式和扩展方法。
表达式树
表达式树是将Lambda表达式按树形结构来进行组合的一种数据结构,其主要作用是为了在LINQ中构造动态查询。
好文链接
打造自己的LINQ Provider(上):Expression Tree揭秘
C#学习笔记(九):LINQ和表达式树的更多相关文章
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
- MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九
<Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次 SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者http://www.admin10000.com/document/96 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)
目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...
- C#.NET学习笔记11,12---布尔表达式2组合,if语句
C#.NET学习笔记11---布尔表达式2组合 2013/9/6 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com int ...
- Python学习笔记九
Python学习笔记之九 为什么要有操作系统 管理硬件,提供接口. 管理调度进程,并且将多个进程对硬件的竞争变得有序. 操作系统发展史 第一代计算机:真空管和穿孔卡片 没有操作系统,所有的程序设计直接 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
随机推荐
- Java [Leetcode 337]House Robber III
题目描述: The thief has found himself a new place for his thievery again. There is only one entrance to ...
- 【原创】回溯线搜索 Backtracking line search
机器学习中很多数值优化算法都会用到线搜索(line search).线搜索的目的是在搜索方向上找到是目标函数\(f(x)\)最小的点.然而,精确找到最小点比较耗时,由于搜索方向本来就是近似,所以用较小 ...
- ffmpeg开发指南
FFmpeg是一个集录制.转换.音/视频编码解码功能为一体的完整的开源解决方案.FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用.FFmpeg支持MPEG.DivX.M ...
- Servlet,JDBC,JSONObject三者配和处理客户端请求并返回正确的json数据
JSON简介 首先我们来理解json(JavaScript Object Notation),如果你熟悉python的字典结构和列表结构,其实json格式是非常容易理解的,当然不熟也不难理解,网上的资 ...
- poj 2063 Investment
题意:给定一个初始资金capital,然后给定d种投资方案,每种投资方案中有投资额value[i](是1000的倍数)和利息interest[i],每年的投资就可以拿到全部利息,然后累加起来继续投资利 ...
- PHP最佳实践(译)
原文: PHP Best Practices-A short, practical guide for common and confusing PHP tasks 译者:youngsterxyf 最 ...
- 【转】android Apk打包过程概述_android是如何打包apk的
最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成 ...
- android 应用页面与数据申请逻辑剥离;
1.页面与数据申请剥离,数据申请框架可以灵活更换,解耦合: 2.对应页面的数据申请类中,将返回数据解析剥离,灵活更换数据返回及对应解析: 二.模块划分: 1.一些通用的工具类,可以考虑迁移到com.c ...
- ant 安装过程中问题记录
最近在本机安装ant过程中出现一些问题,在此记录一下. 1.Unable to locate tools.jar. Expected to find it in C:/Program Files/Ja ...
- 通过简单的Linux内核启动程序代码窥探操作系统的启动原理
作者:吴乐 山东师范大学 <Linux内核分析> 孟宁 MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.程序设计与分析 ...