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是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...
随机推荐
- Jsp+servlet+mysql搭建套路
1.建立数据库根据需求建立相应的数据库确立数据库的字段.属性.主键等2.建立javaweb项目,搭建开发环境在开发环境的/WebRoot/WEB-INF下建立lib文件夹,存放需要使用的jar包常用的 ...
- UVa 11248 Frequency Hopping (网络流)
题意:给定上一个网络,每个边有一个容量,问你能不能从 1 到 n,使得流量为 c,如果不能,那么是不是可以修改一条边,使得达到. 析:背景就是一个网络流,如果原图能跑出来,那么就不用了,就肯定能达到, ...
- centOS下NFS服务器的安装配置详解
一.NFS简介 NFS就是Network FileSystem的缩写,最早之前是由Sun公司所发展出来的.他最大的功能就是可以透过网络,让不同的机器.不同的操作系统可以彼此分享个别档案(share f ...
- event对象的clientX,offsetX,screenX,pageX和offsetTop,offsetHeight等等
先总结下区别: event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性 eve ...
- 四则运算(Java)--温铭淇,付夏阳
GitHub项目地址: https://github.com/fxyJAVA/Calculation 四则运算项目要求: 程序处理用户需求的模式为: Myapp.exe -n num -r size ...
- 将Heap RID转换成RID格式
使用DBCC PAGE命令查看索引叶子层中的索引键(最后一个参数为3才会显示索引键对应的HEAP RID)时,可以使用下面的SQL将HEAP RID转换成 FileId:PageId:SlotNo的格 ...
- AndroidPn消息推送
接着前面的工作,消息接收之后,要推送给不同的客户端.关于消息推送,网上有很多方式,http长连接,xmpp协议,还有一个谷歌的貌似叫C2DM的东西. 在此之前,用openfire做了一个小demo,例 ...
- html5 app开发
如今html5技术越来越成熟,很多iPhone 及Android 上的移动APP都能用html5来开发完成.让我们一起来了解一下html5开发app. 一.HTML5框架开发的移动APP 编写开发游戏 ...
- MongoDB与SqlSugar与Ado.Net对比
SqlSugar NET 4.+ & .NET CORE 高性能 轻量级 ORM框架,众多.NET框架中最容易使用的数据库访问技术 MongoDB与MySql的安装省略...虽然遇到了一些意外 ...
- MVVM前端框架
早开始接触MVVM框架的时候,是在学习WPF的时候,后面陆陆续续接触到了很多的前端JS框架,个人觉得大同小异,也没有去研究源代码,所以都停留在使用的阶段.当然对于我来说,使用这些JS框架,最关注的无非 ...