List<T>, IQueryable, IEnumerable 关系和区别

news2024/11/27 14:44:14

最近在修项目的历史代码,发现搞混了很多拓展方法,写一篇博客澄清一下。

概念需要:iqueryable不应该和ienumerable比而应该和ilist,ienumerable是这两者的父接口

问题:IQueryable, IEnumerable的?

(1)所有对于IEnumerable的过滤、排序、分组、聚合等操作,都是在内存中进行的。也就是说把所有的数据不管用不用得到,都从数据库倒入内存中,只是在内存中进行过滤和排序操作,但性能很高,空间换时间,用于操作本地数据源。

(2)所有对于IQueryable的过滤、排序、分组、聚合等操作,只有在数据真正用到的时候才会到数据库中查询,以及只把需要的数据筛选到内存中。Linq to SQL引擎会把表达式树转化成相应的SQL在数据库中执行,这也是Linq的延迟加载核心思想所在,在很复杂的操作下可能比较慢了,时间换空间。

(3)操作本地数据源用IEnumerable,操作远程数据源用IQueryable

问题:IQueryable接口的特殊之处?

它继承自IEnumerable,:Expression会把查询表达式生成表达式树缓存起来,只有当真正需要用到的时候,才会由IQueryProvider解析表达式树,翻译成sql语句执行数据库查询操作。而Func是个委托,必须要先执行完才能进行下一个方法的调用。

更直白点的说,就是:IQueryable是负责生成SQL语句的,但并不马上执行;而IEnumerable是对任意类型的集合都能操作的,不限于是数据库还是一般的Array还是List。

问题:关于List<T>

List<T>也继承自IEnumerable,所以Where、OrderBy这些方法也能用,同时,List<T>它也是继承了IEnumerable接口,所以,它也不是延迟加载的,但支持延迟查询。

勘误:拓展方法的入参

IQueryable和IEnumerable

IQueryable

延时执行;扩展方法接受的是Expression(必须要能转成sql,否则报错)

IEnumerable

延时执行;扩展方法接受的是Func(C#语法)

Func是. NET类库从3.0开始新增的内置委托,用于实现返回类型为任何有返回类型的函数的调用。 Func的参数列表的格式为传入类型参数列表+返回列表。

IEnumerable.Where 参数为 Func,如果使用下面的写法, ctx.Books 作为 IQueryable 类型会向上转型为 IEnumerable

 这也解释了IQueryble与IEnumerable的一个区别,因为IQueryble里定义了表达式树,所以也解释了它为什么能够实现服务器端过滤。

所以,我犯下的错误在这

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

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

相关文章

Linux vi/vim

vi/vim 的使用 基本上 vi/vim 共分为三种模式&#xff0c;分别是命令模式&#xff08;Command mode&#xff09;&#xff0c;输入模式&#xff08;Insert mode&#xff09;和底线命令模式&#xff08;Last line mode&#xff09;。 这三种模式的作用分别是&#xff1a; 命令模…

数据分析可视化-FineReport 图表排序接口

1. 概述 1.1 应用场景 图表数据展示的顺序是由图表绑定的数据顺序决定的&#xff0c;一般建议在 SQL 中排好序再用图表实现。 但总有些场景不支持提前在 SQL 中排好序&#xff0c;或需要图表实现动态排序&#xff0c;此时可参考本文方法使用排序接口实现。 1.2 功能简介 Fi…

文本转语音免费 微软Azure官网

使用跨 140 种语言和变体的 400 种神经网络语音吸引全球受众。使用极具表现力和类似人类的声音&#xff0c;使文本阅读器和已启用语音的助理等方案栩栩如生。神经网络文本转语音支持多种朗读风格&#xff0c;包括新闻广播、客户服务、呼喊、耳语以及高兴、悲伤等情感。 地址 文…

数据结构---二叉堆

二叉堆二叉堆自我调整插入节点&#xff08;上浮&#xff09;删除节点(下沉)构建二叉堆(所有非叶子节点依次“下沉”)二叉堆本质上是一种完全二叉树&#xff0c;它分为两个类型。最大堆最小堆 最大堆的任何一个父节点的值&#xff0c;都大于或等于它左、右孩子\节点的值 最小堆…

【实测】windows安装部署go实录(超详细)

之前我的课程中&#xff0c;关于go语言的安装是主要展示了mac的&#xff0c;windows的就一笔带过了。 结果被我说着了&#xff08;可能在第一步直接被劝退&#xff09;&#xff0c;好多用windows的小伙伴部署go语言环境各种问题各种坑&#xff0c;网上教程看了个一知半解。没办…

网络工程毕业设计 SSM药品管理系统(源码+论文)

文章目录1 项目简介2 实现效果2.1 界面展示3 设计方案3.1 概述3.2 系统流程3.2.1 添加信息流程3.2.2 操作流程3.2.3删除信息流程3.3 系统结构设计4 项目获取1 项目简介 Hi&#xff0c;各位同学好呀&#xff0c;这里是M学姐&#xff01; 今天向大家分享一个今年(2022)最新完成…

域0day-(CVE-2022-33679)容易利用吗

前言 最近twitter上关于CVE应该CVE-2022-33679比较火了&#xff0c;但是资料也是比较少&#xff0c;下面来唠唠吧。 kerberos认证原理 先了解几个概念 认证服务(Authentication server&#xff09;:简称AS,认证客户端身份提供认证服务。 域控服务器(Domain Control&#x…

ubuntu 安装 MySql 【亲测有效】

目录 一&#xff1a;ubuntu安装mysql 二&#xff1a;mysql 中文乱码 解决 三&#xff1a;Mysql数据库 远程连接授权 四&#xff1a;卸载Mysql并重新安装 五&#xff1a;Mysql 远程连接测试 一&#xff1a;ubuntu安装mysql 首先来到opt(安装)目录下&#xff0c;开启终端&am…

压缩包密码如何解除?

压缩包设置了加密&#xff0c;需要输入压缩包密码才能够顺利解压文件出来。但是有些时候&#xff0c;一些文件只需要一段时间内要加密&#xff0c;之后文件不需要加密了&#xff0c;每次解压文件的时候还是需要输入压缩包密码才行&#xff0c;就很麻烦&#xff0c;那么RAR压缩包…

分布式状态机共识协议 Copilot

目录 前言 定义 slowdown 为什么现有的共识协议无法容忍 slowdown Copilot 如何处理 slowdown 设计 模型 排序 Client 同时发送指令至 pilot 与 copilot Pilot 提议指令与其初始依赖 节点回复 FastAccept Pilot 尝试通过 fast path 来 commit 该指令 Pilot 在 Acc…

C++11标准模板(STL)- 算法(std::min)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 返回各给定值中的较小者 …

基于Java实现(PC)职员工作量管理系统【100010042】

工作量统计系统 一、概述 ​ 在本次专业课实践中我选取到的题目为员工工作量统计系统。该系统分为三个模块&#xff0c;一是实现员工的登录&#xff0c;二是进入到员工的个人界面&#xff0c;并显示&#xff0c;输出员工的个人信息&#xff0c;同时还可以进行输入。第三个模块…

div对角线来回浮动显示

animation-timing-function linear 动画从头到尾的速度是相同的。 ease 默认。动画以低速开始&#xff0c;然后加快&#xff0c;在结束前变慢 ease-in 动画以低速开始 ease-out 动画以低速结束 ease-in-out 动画以低速开始和结束 steps(int,start|end) 指定了时间函数中的间隔…

公司对外投资和担保

一、公司对外投资和担保规范 公司对外投资和外他人提供担保&#xff0c;需承担相应的责任 公司可以对外投资和提供担保 二、公司提供担保的方式 保证 抵押 质押 三、公司提供担保的规定 公司对外承担的规定 公司向其他企业投资或者为他人提供担保&#xff0c;依照公司章程的规…

seata-server-1.4.2的环境搭建

修改seata-server-1.4.2/conf目录下的file.conf和registry.conf file.conf 将store下mode修改为db&#xff0c;找到db模块修改 driverClassName、url、user、password mysql 5.使用 driverClassName "com.mysql.jdbc.Driver" mysql 8 使用 driverClassName "…

Docker入门之docker-compose

一&#xff0c;Docker-compose简介 1&#xff0c;Docker-compose简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c…

【MATLAB教程案例62】使用matlab实现基于PointNet++网络的点云数据分类仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.PointNet++网络理论概述

通过java代码实现ES中的常用搜索

目录 测试环境准备 在指定索引下搜索全部&#xff08;可以指定字段&#xff09; 通过ids进行搜索 对搜索结果进行分页 match分词搜索 不分词模糊搜索&#xff1a;wildcardQuery与matchPhraseQuery term 搜索&#xff08;精确匹配&#xff09; multi_match搜索 bool搜索…

23年如何准备考PMP?这4点建议你得看

23年的PMP考试还有3个多月&#xff0c;现在开始备考&#xff0c;再合适不过&#xff0c;我这里提出四点备考建议&#xff0c;希望能帮到备考的大家&#xff1a; 【《PMBOK指南》】 PMP的教材仍是第六版&#xff0c;如果有第七版就看第七版&#xff0c;纸质或者电子版都可以&am…

【基础强训】day1

一、选择题&#xff1a; 1. 以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A 是无限循环 B 循环次数不定 C 4次 D 3次 C y123为真&#xff0c;所以就循环四次。 2. 以下程序的运行结果是&#xff08;&#xff…