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基础知识小记三的更多相关文章

  1. Linq基础知识小记四之操作EF

    1.EF简介 EF之于Linq,EF是一种包含Linq功能对象关系映射技术.EF对数据库架构和我们查询的类型进行更好的解耦,使用EF,我们查询的对象不再是C#类,而是更高层的抽象:Entity Dat ...

  2. Linq基础知识小记二

    书写Linq查询有两种方法,第一种是通过方法语法(也就是扩展方法),第二种是查询表达式语法. 1.方法语法 方法语法就是通过扩展方法和Lambda表达式来创建查询 (1).链式查询 这种查询方式很多语 ...

  3. EF基础知识小记三(设计器=>数据库)

    本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...

  4. Linq基础知识小记一

    1.LINQ(语言级集成查询)的作用就是提供一种统一且对称的方式,让程序员在广义的数据上获取和操作数据.广义的数据包括XML文档数据.元数据.System.Data.dll和System.Data.S ...

  5. EF基础知识小记四(数据库=>模型设计器)

    EF基础知识小记三(设计器=>数据库)介绍了如何创建一个空设计器模型,并如何将模型同步到数据库的表中,本文则主要介绍如何将一个存在的数据库同步到模型设计器中.为了能快速的模拟这个过程,给出一下建 ...

  6. 运维之Linux基础知识(三)

    运维之Linux基础知识(三) 1. 查看文本 cat tac more less head tail 1.1 cat 连接并显示文件 cat -n:在显示的时候,将每一行编号 -E:显示结束符$ - ...

  7. Java JDBC的基础知识(三)

    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...

  8. 基础知识《三》java修饰符

    一.修饰符 private 成员随时都是“私有”的,任何人不得访问.但在实际应用中,经常想把某些东西深深地藏起来,但同时允许访问衍生类的成员. protected 关键字可帮助我们做到这一点.它的意思 ...

  9. 林大妈的JavaScript基础知识(三):JavaScript编程(2)函数

    JavaScript是一门函数式的面向对象编程语言.了解函数将会是了解对象创建和操作.原型及原型方法.模块化编程等的重要基础.函数包含一组语句,它的主要功能是代码复用.隐藏信息和组合调用.我们编程就是 ...

随机推荐

  1. C语言学生管理系统源码分享

    大家好 我就是如假包换的...陈玲 自从运营了C语言程序设计微信公众号 很多粉丝都给我备注 ...奇葩 实在是不敢当 也被人开始叫玲玲姐 我知道 很多人都想看我出境 我本人也有 年多的舞台演讲训练 实 ...

  2. centos6 mysql 安装与配置

    MySQL简介: 由于其体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库.MySQL是一个多用户.多线程的关系型数据库管理 ...

  3. C++ 11可变参数接口设计在模板编程中应用的一点点总结

    概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...

  4. java递归和反向递归

    1. 递归查询树tree结构有两种做法: 第一种,递归查询数据库结构, 第二种,一次性将数据库表中的所有数据查出来,然后再递归查出来的list集合, 第一种做法适合数据量较少的tree结构,因为要一直 ...

  5. 11i AP & GL 月末对账时常用系统报表

    11i AP & GL 月末对账时常用系统报表  http://www.cnblogs.com/benio/archive/2011/10/14/2212169.html AP: 1.Invo ...

  6. JavaLogin小框架制作【精品博客】

    做一个小登录接口方法,让用户传入用户名,密码,就可以知道登录的结果信息,并以接口监听的方式控制. 先看客户端执行效果: 输入正确: 输入错误: 模拟客户端使用登录小框架: package com.de ...

  7. ECG心电图数据2

    1.如何下载获取MIT-BIH的数据从下面这个官方链接页面可以下载到所有48组MIT-BIH心电数据: http://www.physionet.org/physiobank/database/mit ...

  8. Xml 序列化和反序列化

    xml序列化帮助类 using System.IO; using System.Xml; using System.Xml.Serialization; public class XmlHelper ...

  9. 利用MVC5+EF6搭建博客系统

    https://www.cnblogs.com/wyt007/p/7880137.html

  10. The rapid development platform upgrade, leave the time to yourself, the work is lost to the soft platform

    Bring me back to your home. Please leave your work behind! Soft agile development framework V7.0 new ...