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 { ...
随机推荐
- bzoj1297: [SCOI2009]迷路
矩阵. 一个图的邻接矩阵的m次幂相当于 长度恰好为m的路径数.这要求边权为1. 因为边权小于等于9,所以可以把一个点拆成9的点. 拆成的第(i+1)个点向第i个点连边. 如果存在边(u,v,w) 就由 ...
- SyntaxHighlighter -- 代码高亮插件
SyntaxHighlighter 下载文件里面支持皮肤匹配. 地址:http://alexgorbatchev.com/SyntaxHighlighter/
- 转:ASP.NET MVC中Unobtrusive Ajax的妙用
Unobtrusive Javascript有三层含义:一是在HTML代码中不会随意的插入Javsscript代码,只在标签中加一些额外的属性值,然后被引用的脚本文件识别和处理:二是通过脚本文件所增加 ...
- 《SPFA算法的优化及应用》——姜碧野(学习笔记)
一.核心性质:三角不等式.最短路满足d[v]<=d[u]+w(u,v) 二.SPFA两种实现: 常见的是基于bfs的,这是直接对bellman-ford用队列维护.根据最短路的长度最长为(n-1 ...
- tcprstat源码分析之tcp数据包分析
tcprstat是percona用来监测mysql响应时间的.不过对于任何运行在TCP协议上的响应时间,都可以用.本文主要做源码分析,如何使用tcprstat请大家查看博文<tcprstat分析 ...
- mysql 自旋锁
自旋(spin)是一种通过不间断地测试来查看一个资源是否变为可用状态的等待操作,用于仅需要等待很短的时间等待所需资源的场景.使用自旋这种“空闲循环(busy-loop)”来完成资源等待的方式要比通过上 ...
- visual studio 2013 配置 ef+pgsql
环境:VS2013,WIN7 准备工作: 1.有哪些供应商提供EF6的支持? 可以看msdn给出的答案:Which providers are available for EF6? 在本文使用 Dev ...
- 典型的 SQL 注入过程(转)
无意间发现某站点存在 SQL 注入漏洞,于是利用这个漏洞提权并获取服务器控制权.这个案例很典型,像是教科书式的典型入侵步骤,下面就以这个案例展示从 SQL 注入到获取目标服务器控制权限的全过程. 发现 ...
- 关于AsyncTask 的退出
public class Task extends AsyncTask<Void, Void, Void>{ @Overrideprotected Void doInBackground( ...
- [Irving] SQL 2005/SQL 2008 备份数据库并自动删除N天前备份的脚本
以下为SQL脚本,本人以执行计划来调用,所以改成了执行命令,大家可根据自己需要改为存储过程使用 )='E:\MsBackUp\SqlAutoBackup\' --备份路径; --备份类型为全备,1为差 ...