IEnumerable和IQueryable的区别

  

 

 IEnumerable<T>在.Net2.0中我们已经很熟悉了.你想要利用Foreach迭代吗?实现 IEnumerable<T>吧!你想直接做为数据源绑定到控件吗?使用IEnumerable吧!是的.只要是序列.它都实现了 IEnumerable<T>(.Net1.0下的序列类除外).除了这些.LINQ的出现.还赋予了 IEnumerable<T>更强悍的功能.IQueryable<T>继承IEnumerable<T>.详细看 IEnumerable<T>和IQueryable<T>这两个API的签名.可以说非常相似.从某种意义上来说.它们是可以 互换的.但是却不总是可以互相代替的.IEnumerable<T>和IQueryable<T>的行为有所不同.其性能方面也 可能天差地别.例如:

var q = from c in dbContext.Customers
where c.City == "shenzhen"
select c;
var q = (from c in dbContext.Customers
where c.City == "shenzhen"
select c).AsEnumerable();

这两个查询看起来几乎一模一样.查询返回的结果也一样.但他们的实现方式却大相径庭.第一个查询使用了LINQ2SQL的处理方式.第二个查询则使 用了LINQ2Object处理.通过前面的学习.我们知道,LINQ2Object的处理结果是把LINQ表达式映射成对应的委托,而LINQ2SQL 则是保存了一系列的"步骤"---表达式树的处理方式.两者的区别简单的理解就是LINQ2Object将数据存放在内存中.而LINQ2SQL则是把数 据存放在远程的服务器中.

场景模拟

       举一个例子.现在有两个水果批发商A,B..A除了是批发商,自己还承包了几个果场.自产自销.B和几个大型的果场合作.只做批发工作.每次客人来A订 货.指定要什么货物,A就可以立刻拿出.速度快.服务佳.缺点是由于是自己的果场.那量肯定不大,而且品种不齐全,小作坊式的经营.B呢?每次客户订 单.B是先把客户需要的货物规格等记录下来.一次性去各个果场取货.这样B的优点就是量大.品种多.但速度可能偏慢(收到货的时间).不过若B以A的销售 方式来销售.那么B的效绩肯定是让人十分不满意,工厂式的经营.

         总结之,IEnumerable<T>查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大 量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功.而IQueryable<T>却总能只提供你所需要的数 据.大大减少了数据的传输.这就好比我们在小作坊下订单.小作坊老板跟我们说.他的货刚好比你所需要的多出一些.你只能要了它.不然剩下一点他不好卖等 等.而大工厂却不会出现这种状况.

个性要求

虽说小作坊很多弊病.但有时候却有着大工厂无法媲美的服务.假如你需要一种八种水果组合套餐.大工厂一般不会为你量身定做.单对单服务.相反.小作坊客源有限.一般都会满足你的个人需求.

场景切换:在<<[More Effective C#]Lambda表达式优化>>里我们提到过.LINQ2SQL中是不允许出现自定义方法的.这是由于LINQ2SQL的处理方式.详见<<[More Effective C#]Lambda表达式优化>>.而LINQ2Object却能很好的满足我们自定义方法这个性化的要求.

但是.除了自定义方法.还有一些内置的方法IEnumerable<T>和IQueryable<T>是同时支持的.例如常见的string类的操作方法.substring,indexof等等.

 

IQueryable继承自IEnumerable,所以对于数据遍历来说,它们没有区别。

1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功。
使用IEnumerable,所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,只是在内存中进行过滤和排序操作。

2.IQueryable却总能只提供你所需要的数 据.大大减少了数据的传输
IQueryable的优势是它有表达式树,所有对于IQueryable的过滤,排序等操作,都会先缓存到表达式树中,只有当真正遍历发生的时候,才会将表达式树由IQueryProvider执行获取数据操作。

尾声

      可能这个例子在这里有些牵强.但相信IEnumerable<T>和IQueryable<T>之间的区别不难理解.更多时候我 们在查询序列的时候.要考虑到底是本地查询好.还是远程查询好.至于哪种查询更好.没有绝对的说法.适合应用环境,已经能发挥最大效应的.那就是最好的.

 IEnumerable<T> 是小作坊做法,因为它把数据加载到本地后才做过滤操作,

IEnumerable<T> 数据已加载到内存

IQueryable<T> 是工厂模式,按需订购.在实际场景中, 工作模式的场景还是比较多的. 

IQueryable<T> 此时为表达式,待ToList的时候加载到内存 

转自:http://www.dotblogs.com.tw/kongyiyun/archive/2010/10/22/18510.aspx

转载于:https://www.cnblogs.com/383855647chenyu/p/5110520.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八、操作系统——基本分页存储管理的基本概念(详解)

一、思考&#xff1a;连续分配方式的缺点&#xff1f; 考虑支持多道程序的两种连续分配方式&#xff1a; 固定分区分配&#xff1a;缺乏灵活性&#xff0c;会产生大量的内部碎片&#xff0c;内存的利用率很低。动态分区分配&#xff1a;会产生很多外部碎片&#xff0c;虽然可以…

python 输出 GPU内存 最大使用率

安装 pip install nvidia-ml-py from pynvml import *def nvidia_info():# pip install nvidia-ml-pynvidia_dict {"state": True,"nvidia_version": "","nvidia_count": 0,"gpus": []}try:nvmlInit()nvidia_dict["n…

oracle 查看服务器密码修改,如何修改oracle用户密码

修改oracle用户密码的方法&#xff1a;首先连接oracle数据库所在服务器&#xff0c;并进入oracle控制台&#xff1b;然后输入“select username from dba_users”查看用户列表&#xff1b;最后输入修改用户口令即可。本教程操作环境&#xff1a;windows7系统、oracle版&#xf…

计算机组成原理——校验码(奇偶校验码、汉明校验码、循环冗余校验码)

一、为什么要使用校验码&#xff1f; 数据在计算机系统内加工、存取和传送的过程中可能会产生错误。为了减少和避免这类错误&#xff0c;引入了数据校验码。数据校验码是一种常用的带有发现某些错误&#xff0c;甚至带有一定自动改错能力的数据编码方法。 例子&#xff1a; …

(转)基因芯片数据GO和KEGG功能分析

随着人类基因组计划(Human Genome Project)即全部核苷酸测序的即将完成&#xff0c;人类基因组研究的重心逐渐进入后基因组时代(Postgenome Era)&#xff0c;向基因的功能及基因的多样性倾斜。通过对个体在不同生长发育阶段或不同生理状态下大量基因表达的平行分析&#xff0c;…

LeetCode 2164. 对奇偶下标分别排序

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums 。根据下述规则重排 nums 中的值&#xff1a; 按 非递增 顺序排列 nums 奇数下标 上的所有值。 举个例子&#xff0c;如果排序前 nums [4,1,2,3] &#xff0c;对奇数下标的值排序后变为 [4,3,2,1] 。奇…

九、操作系统——基本地址变换机构(详解)

一、概览 重点理解、记忆基本地址变换机构&#xff08;用于实现逻辑地址到物理地址转换的一组硬件机构&#xff09;的原理和流程 二、基本地址变换机构 基本地址变换机构可以借助进程的页表将逻辑地址转换为物理地址。 通常会在系统中设置一个页表寄存器&#xff08;PTR&am…

客户端显示服务器图片不显示,客户端请求服务器图片不显示

客户端请求服务器图片不显示 内容精选换一换已成功登录鲲鹏代码迁移工具。只有管理员用户(portadmin)可以执行生成CSR文件、导入web服务器证书、重启和更换工作密钥的操作。普通用户只能查看web服务端证书信息。SSL证书通过在客户端浏览器和web服务器之间建立一条SSL安全通道(访…

LeetCode 2165. 重排数字的最小值(计数)

文章目录1. 题目2. 解题1. 题目 给你一个整数 num 。重排 num 中的各位数字&#xff0c;使其值 最小化 且不含 任何 前导零。 返回不含前导零且值最小的重排数字。 注意&#xff0c;重排各位数字后&#xff0c;num 的符号不会改变。 示例 1&#xff1a; 输入&#xff1a;nu…

2的次方表(1~64次方)

2的次方表&#xff08;1~64次方&#xff09; 2的1次方&#xff1a;2 2的2次方&#xff1a;4 2的3次方&#xff1a;8 2的4次方&#xff1a;16 2的5次方&#xff1a;32 2的6次方&#xff1a;64 2的7次方&#xff1a;128 2的8次方&#xff1a;256 2的9次方&#xff1a;512 2的10次…

Little Alchemy 游戏 - 扒答案。。 Java

Little Alchemy 是个用四个基本元素组合生成的小游戏。。。连Excalibur都可以有 写的代码是从这个游戏的hint页面得到答案的 1 import java.io.*;2 import java.net.URL;3 import java.util.*;4 5 public class Main {6 7 public static void main(String[] args) {8 …

优酷路由宝无线服务器,优酷路由宝一站式刷潘多拉!!!整理版

本帖最后由 louis000 于 2015-11-3 14:57 编辑优酷路由宝L1W刷潘多拉固件-整理优化版准备工作&#xff1a;使用有线连接路由宝和电脑&#xff1b;电脑网络连接设置为手动获取IP地址。---------------------------------------------------------------------------------------…

LeetCode 2166. 设计位集(Bitset)

文章目录1. 题目2. 解题1. 题目 位集 Bitset 是一种能以紧凑形式存储位的数据结构。 请你实现 Bitset 类。 Bitset(int size) 用 size 个位初始化 Bitset &#xff0c;所有位都是 0 。void fix(int idx) 将下标为 idx 的位上的值更新为 1 。如果值已经是 1 &#xff0c;则不…

Web框架——Flask系列之Flask简介(一)

一、Web应用程序作用 Web(World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档 二、关于Web框架 &#xff08;一&#xff09;什么是Web框架&#xff1f; 已经封装好了一段代码,协助程序快速开发,相当于项目半成品开发者只需要按照框架约定要求,在指定位置写上自己…

服务器系统网卡驱动装不上,网卡驱动装不上去怎么办?

满意答案hgtn1q6xvv52014.09.28采纳率&#xff1a;58% 等级&#xff1a;13已帮助&#xff1a;9534人现提示原: SP2更考虑安全问题IP设置自获取其实DHCP服务器获取IP及相关参数程能由于某种原没完. SP1代种情况操作系统防止脱网(微软写)自作主张网卡设置169.x.x.x保留IP作任何…

moco-globalsettings

1.单个json文件 &#xff08;1&#xff09;目录配置 &#xff08;2&#xff09;新建foo.json 在project文件夹中新建foo.json [{"request" : {"uri" : "/foo"},"response" : {"text" : "foo"}} ] &#xff08;3&a…

十三、MySQL存储过程相关知识总结 + 案例讲解(强化)

一、存储过程VS函数 存储过程和函数&#xff1a;类似于java中的方法 好处&#xff1a; 1、提高代码的重用性 2、简化操作 二、存储过程 含义&#xff1a;一组预先编译好的SQL语句的集合&#xff0c;理解成批处理语句 1、提高代码的重用性 2、简化操作 3、减少了编译次数并且…

LeetCode 2169. 得到 0 的操作数

文章目录1. 题目2. 解题1. 题目 给你两个 非负 整数 num1 和 num2 。 每一步 操作 中&#xff0c;如果 num1 > num2 &#xff0c;你必须用 num1 减 num2 &#xff1b; 否则&#xff0c;你必须用 num2 减 num1 。 例如&#xff0c;num1 5 且 num2 4 &#xff0c;应该用 …

阿里云 腾讯云 服务器挂载数据盘

在默认拥有的腾讯云服务器是没有额外的数据盘的&#xff0c;默认Linux只有8GB系统盘&#xff0c;一般的网站也足够使用&#xff0c;如果额外购买的数据盘安装系统之后根据不同的面板、系统的路径问题可能不会自动加载到指定的数据盘目录&#xff0c;需要我们手工进行加载数据盘…

LeetCode 2171. 拿出最少数目的魔法豆(排序)

文章目录1. 题目2. 解题1. 题目 给你一个 正 整数数组 beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩下的 非空 袋子中&#xff08;即 至少 还有 一颗 魔法豆的袋…