Linq基础知识小记三
1、子查询
Linq中的子查询思想和Sql中的子查询其实差不多,
对于方法语法,一个子查询包含在另一个子查询的Lambda表达式中,代码如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = names.OrderBy(n => n.Split().Last());
n.Split().Last()就是一个子查询
下面通过一个例子来讲解Linq子查询的两种不同的方式.找出一个IEnumerable<T>长度中最长的字符串
string[] names = { "James", "Kobe", "Curry", "Durrent" };
//方法语法
IEnumerable<string> method = names.Where(n=>n==(names.OrderBy(l => l.Length)).Last());
foreach (var n in method)
{
Console.WriteLine(n);
}
string[] names = { "James", "Kobe", "Curry", "Durrent" };
//表达式语法
var express = from n in names
where n ==
(from i in names orderby i.Length descending select i).First()
select n;
foreach (var n in express)
{
Console.WriteLine(n);
}
2、本地查询和解释查询
本地查询(Linq To Object)和解释查询(Linq To Sql)对于子查询的处理方式不一样.
(1)、本地查询(Linq To Object)对于外部查询的每一次循环,子查询都会被重新被执行一次,所以像上面的案例当外部查询循环每执行一次,内部子查询就会被重新执行一次,这是很严重的性能浪费,所以上面的案例可以这样改写,代码如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
int shortest = names.Max(n => n.Length);
//表达式语法
var express = from n in names
where n.Length == shortest
select n;
foreach (var n in express)
{
Console.WriteLine(n);
}
(2)、解释查询处理子查询的方式和本地查询就截然不同,在解释查询中,外部查询和子查询是作为一个单元进行处理的,这样就只需要联结一次数据库就行了,所以上面的案例适合解释查询,不适合本地查询.
(3)、子查询不会改变Linq延迟执行的特性,因为子查询总是间接调用的.
2、Linq查询创建攻略
常用的Linq查询方式有三种两种已经在前面用到过了,下面有个案例,去除一个字符串数组中的所有的元音字母,然后对长度大于1的元素进行按长度排序.
第一种:链式查询
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = names.Select(n => Regex.Replace(n, "[aeiou]", "")).Where(n => n.Length > )
.OrderBy(n => n.Length);
foreach (var n in result)
{
Console.WriteLine(n);
}
第二种:类似Sql子查询的查询
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = from n in
(
from n in names
select Regex.Replace(n, "[aeiou]", "")
)
where n.Length >
orderby n.Length
select n; foreach (var n in result)
{
Console.WriteLine(n);
}
第三种:重点讲解,into关键字
select关键字或者group关键字意味着查询的结束,但是into关键字可以使我们在结果投影之后继续操作,它是对分步构建查询表达式的一种简写方式,代码如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<string> result = from n in names
select Regex.Replace(n, "[aeiou]", "")
into noVowel
where noVowel.Length >
orderby noVowel.Length
select noVowel;
foreach (var n in result)
{
Console.WriteLine(n);
}
3、数据转换
Linq的数据转换,也叫结果投影。到目前为止,我们只看到了单个标量的元素,但是通过对象初始化器和匿名类型和let关键字我们能输出更复杂的数据类型
(1)、对象初始化器
string[] names = { "James", "Kobe", "Curry", "Durrent" };
IEnumerable<TempProjection> temp = from n in names
select new TempProjection
{
Original = n,
Vowelless = Regex.Replace(n, "[aeiou]", "")
}; IEnumerable<string> query =
from n in temp
where n.Vowelless.Length >
select n.Original; foreach (var n in query)
{
Console.WriteLine(n);
} class TempProjection
{
public string Original { get; set; }
public string Vowelless { get; set; }
}
(2)、匿名类型
匿名类型其实和对象初始化其差不多,就是我们不用创建类型,让编译器来帮助我们创建,代码如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var temp = from n in names //注意这里只能用关键字var
select new
{
Original = n,
Vowelless = Regex.Replace(n, "[aeiou]", "")
}; IEnumerable<string> query =
from n in temp
where n.Vowelless.Length >
select n.Original; foreach (var n in query)
{
Console.WriteLine(n);
}
使用匿名类型配合关键字var能帮助我们极大的减少代码量.
(3)、Let关键字
Let关键字能帮助我们引入新的变脸的同时,保持范围变量,示例代码如下:
string[] names = { "James", "Kobe", "Curry", "Durrent" };
var temp = from n in names //注意这里只能用关键字var
let vowelless = Regex.Replace(n, "[aeiou]", "")
where vowelless.Length >
select n; foreach (var n in temp)
{
Console.WriteLine(n);
}
let关键字非常灵活和方便,就像例子看到的那样。而且,我们可以使用多个let关键字,并且后面的 let表达式可以引用前一个let关键字引入的变量。
Linq基础知识小记三的更多相关文章
- Linq基础知识小记四之操作EF
1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...
- Linq基础知识小记二
书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1.方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1).链式查询 这种查询方式很多语 ...
- EF基础知识小记三(设计器=>数据库)
本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...
- Linq基础知识小记一
1.LINQ(语言级集成查询)的作用就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据.广义的数据包括XML文档数据.元数据.System.Data.dll和System.Data.S ...
- EF基础知识小记四(数据库=>模型设计器)
EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...
- 运维之Linux基础知识(三)
运维之Linux基础知识(三) 1. 查看文本 cat tac more less head tail 1.1 cat 连接并显示文件 cat -n:在显示的时候,将每一行编号 -E:显示结束符$ - ...
- Java JDBC的基础知识(三)
在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...
- 基础知识《三》java修饰符
一.修饰符 private 成员随时都是“私有”的,任何人不得访问.但在实际应用中,经常想把某些东西深深地藏起来,但同时允许访问衍生类的成员. protected 关键字可帮助我们做到这一点.它的意思 ...
- 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数
JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...
随机推荐
- lpm_clshift ip仿真
今天仿真了一下lpm_clshift ip 其中din为输入的信号,sh_out为输出的信号. 以上为IP的设置. 可以看到din 的00000010 对应的step的2,一个时钟后sh_out的输出 ...
- kallinux2.0安装网易云音乐
安装 dpkg -i netease-cloud-music_1.0.0_amd64.kali2.0(yagami).deb apt-get -f install dpkg -i netease-cl ...
- Ansible之ansible-playbook roles
刚开始学习运用 playbook 时,可能会把 playbook 写成一个很大的文件,到后来可能你会希望这些文件是可以方便去重用的,所以需要重新去组织这些文件. 基本上,使用 include 语句引用 ...
- Hibernate和spring中的session总结
1.this.getSession() 是org.springframework.orm.hibernate3.support.HibernateDaoSupport 中的一个方法,它可以从当前事务或 ...
- $\frac{\pi}{\sin p\pi}$
1.把 $f(x)=\cos px$ 在 $[-\pi,\pi]$ 上展开为 Fourier 级数. \[\cos px=\frac{\sin p\pi}{\pi}(\frac{1}{p}+\sum_ ...
- Android-控制整个APP的异常收集与处理
控制整个App的异常收集与处理,使用前记得要在Application中初始化initCrasHandler CrasHandler APP异常收集类: package common.library.e ...
- 客户端Git代码的下载与提交
(1)git clone 服务器用户名@服务器IP:~/Git目录/.git 功能:下载服务器端Git仓库中的文件或目录到本地当前目录. (2)对Git目录中的文件进行修改. (3)git statu ...
- winform中控件的简单数据绑定
是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性 ...
- flume在windows环境下的使用
Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供对数据进行简单处理, ...
- JSOI2010 满汉全席
题目链接:戳我 一个2-SAT的模板题. (什么是2-SAT呢?就是解决一个情况两种决策的问题,我们根据"选了其中一个点A就必须选一个点B的原则,从A向B连边.最后判断如果在一个强连通分量里 ...