23.C#Queryable的扩展方法(十二章12.1-12.2)
今天要写的知识还真心有点绕呢,对于第一节的内容,其实是把原先在内存中的数据源,换成了从数据库中提取出来的数据。从代码的使用方式上是一样的,直接跳过,来看看IEnumerable和IQueryable的区别。
正如Enumerable类型包含着关于IEnumerable<T>的扩展方法来实现LINQ标准查询操作符一样,Queryabl类型包含着关于IQueryable<T>的扩展方法。IEnumerable<T>和IQueryable<T>有两个重要的区别。
首先IEnumerable<T>的方法都使用委托作为参数,例如,Select方法使用Func<TSource,TResult>。这对于内存中的操作是没有问题的,但对于别处执行查询的LINQ提供器来说,我们需要能执行更详细检查的格式--表达式树。例如,Queryable中相应的Select的重载就要获取类型为Expression<Func<TSource,TResult>>的参数。编译器根本不会关心这些--在查询编译之后,它具有一个需要作为参数传递给方法的Lambda表达式,而Lambda表达式即可以被转换成委托实例,也可以转换成表达式树。如图中的表示,会根据数据源选择相应的重载。

选择两种路径的查询,具体使用哪个路径取决于数据源实现的是IQueryable接口还是IEnumerable接口。
当我们将Lambda表达式传入作为参数时,Lambda表达式即可以转换成委托实例,也可以转换成表达式树实例,左边的路径用于执行内存中的操作,而右边路径用于来在数据库中执行SQL。
Queryable和Enumerable之间的第2个重大差别,Enumerable的扩展方法会完成与对应查询操作符相关的实际工作(至少会构建完成这些工作的迭代器)。例如,Eumerable.Where中的代码执行相关的过滤操作,并在结果序列中生成适当的元素。通过比较,Queryable中的查询操作符的"实现"做的事情非常少。
- IQueryable<T>和相关接口的介绍
IQueryable<T>是从IEnumerable<T>和非泛型的IQueryable继承而来,而IQueryable又继承于非泛型IEnumerable,IQueryable仅有三个属性:QueryProvider、ElementType和Expression。理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列。从LINQ的角度来看,由于是通过IQueryable的Expression属性返回结果,所以查询的详细信息就保存于表达式树中。
请大家给出深入见解,学习一二,斧正。
23.C#Queryable的扩展方法(十二章12.1-12.2)的更多相关文章
- CSAPP:第十二章 并发编程
CSAPP:第十二章 并发编程 12.1 线程执行模型12.2 多线程之间并发通信12.3 其他并发问题 使用应用级并发的应用程序称为并发程序.现代操作系统提供三种基本的构造并发程序的方法: 进程 ...
- o'Reill的SVG精髓(第二版)学习笔记——第十二章
第十二章 SVG动画 12.1动画基础 SVG的动画特性基于万维网联盟的“同步多媒体集成语言”(SMIL)规范(http://www.w3.org/TR/SMIL3). 在这个动画系统中,我们可以指定 ...
- “全栈2019”Java多线程第十二章:后台线程setDaemon()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- Testlink1.9.17使用方法(第十二章 总结)
第十二章 总结 QQ交流群:585499566 TestLink用于进行测试过程中的管理,通过使用TestLink提供的功能,我们可以将测试过程从:测试需求.测试设计.到测试执行.完整的管理起来,同时 ...
- PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)
主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用
进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...
- 《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系后代,ash shell是Unix系统上原来地Bourne shell的简化版本 ...
- 《Django By Example》第十二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...
随机推荐
- sphinx增量索引
首先建立一个计数表,保存数据表的最新记录ID CREATE TABLE `sph_counter` ( `id` int(11) unsigned NOT NULL, `max_id` int(1 ...
- Java读取、创建xml(通过dom方式)
创建一个接口 XmlInterface.java public interface XmlInterface { /** * 建立XML文档 * @ ...
- js制作倒计时效果
该程序可以计算任意指定的两个日期中间的差值. 本例子的指定日期是2017年1月1日,当前时间是2016年10月21日:计算它们之间的差值,在网页上显示如图所示: 关键部分代码: var nowtime ...
- 如何利用ZBrush中的DynaMesh创建身体(二)
之前的ZBrush教程我们在了解了人体比例和结构的前提下,使用ZBrush®软件中的Append功能和InsertSphere笔刷添加躯干.本讲将参照图片继续对“亡灵僵尸”的形体结构进行细致刻画和使用 ...
- sqlite-jdbc jar包下载过程笔记
在网络上找一些开源的jar包和对应的源码时,官网上往往是最为安全,版本最新.但大部分的网站都为英文网站,有时候定位下载地址稍有困难,下面是网上找sqlite-jdbc jar包过程,记录一下,以供参考 ...
- UVALive 6181
模拟题,注意细节.. #include <iostream> #include<stdio.h> #include<math.h> #include<stri ...
- centos下安装xampp,Zend Guard,memcached
这里说的生产环境是php5.4x,要高版本的其实也一样 第一步:安装xampp xampp它是跨平台的,且自带很多拓展,安装之后会为我们省去很多事,使用起来很方便. i>http://sourc ...
- SqlMapConfig.xml中的setting属性设置
<settings cacheModelsEnabled="true" lazyLoadingEnabled="false" en ...
- java 16 -11 ArrayList存储自定义对象并增强for遍历
需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for C:增强for LinkedList,Vector,Colleciton,List ...
- C和指针笔记 3.7 存储类型
变量的破碎类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久. 有三个地方可以用于存在变量:普通内存.运行时堆栈.硬件寄存器. 变量的缺省存储类型取决于它的声明 ...