NET问答:如何理解 IEnumerableT 和 IQueryableT

咨询区

  • stackoverflowuser

请问类型 IQueryable<T>IEnumerable<T>  有什么异同?我应该使用哪一个而不是另一个,代码如下:


IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

我知道这两者都是延迟执行,我应该如何选择?

回答区

  • Kasper Roma

是的,两者都是延迟执行,我来用 SQL Server profiler 来演示两者的不同,考虑下面的代码:


MarketDevEntities db = new MarketDevEntities();IEnumerable<WebLog> first = db.WebLogs;
var second = first.Where(c => c.DurationSeconds > 10);
var third = second.Where(c => c.WebLogID > 100);
var result = third.Where(c => c.EmailAddress.Length > 11);Console.Write(result.First().UserName);

SQL Server profiler 中我捕获到了如下的sql。


"SELECT * FROM [dbo].[WebLog]"

这张表中大概有 100w 条记录,sql花费了大概 90s, 显而易见,代码首先会将 WebLog,也 就是将所有的表记录全部灌入到内存中,然后依次使用 Where() 在内存中进行过滤。

接下来用 IQueryable 替代 IEnumerable, 再次观察一下 SQL Server profiler,可以捕获如下sql。


"SELECT TOP 1 * FROM [dbo].[WebLog] WHERE [DurationSeconds] > 10 AND [WebLogID] > 100 AND LEN([EmailAddress]) > 11"

这个 sql 大概花费了 4s。

IQueryable 中有一个 Expression 属性,它存储着 表达式树,它的完整构建在于 result 变量处(这里是延迟执行),当真正执行的时候,这个 表达式树 会被解析成 sql 到数据库中执行。

点评区

Kasper Roma 大佬说的是有理有节,图文并茂,一看就懂,大写的????????,我还真的特意看了下有没有 Expression 属性 ????????????

//// Summary://     Provides functionality to evaluate queries against a specific data source wherein//     the type of the data is not specified.public interface IQueryable : IEnumerable{//// Summary://     Gets the type of the element(s) that are returned when the expression tree associated//     with this instance of System.Linq.IQueryable is executed.//// Returns://     A System.Type that represents the type of the element(s) that are returned when//     the expression tree associated with this object is executed.Type ElementType { get; }//// Summary://     Gets the expression tree that is associated with the instance of System.Linq.IQueryable.//// Returns://     The System.Linq.Expressions.Expression that is associated with this instance//     of System.Linq.IQueryable.Expression Expression { get; }//// Summary://     Gets the query provider that is associated with this data source.//// Returns://     The System.Linq.IQueryProvider that is associated with this data source.IQueryProvider Provider { get; }}

原文链接:https://stackoverflow.com/questions/2876616/returning-ienumerablet-vs-iqueryablet

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

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

相关文章

c语言实现字母转化为unicode码,用C语言实现中文到unicode码的转换

由于本人喜欢用Notepad编辑器&#xff0c;该编辑器的好处是小巧灵活&#xff0c;但是有几个地方做的不足&#xff0c;但是我都能够很好的采取相应的措施来替代&#xff0c;下面让我们看看Notepad有哪些地方的不足&#xff0c;进而采取怎样的措施。一&#xff1a;Notepad不能编译…

终于有人把云计算、大数据和人工智能讲明白了!

今天跟大家讲讲云计算、大数据和人工智能。为什么讲这三个东西呢&#xff1f;因为这三个东西现在非常火&#xff0c;并且它们之间好像互相有关系&#xff1a;一般谈云计算的时候会提到大数据、谈人工智能的时候会提大数据、谈人工智能的时候会提云计算……感觉三者之间相辅相成…

c语言程序设计新编教程答案钱雪忠,新编C语言程序设计教程

图书简介配套资源&#xff1a;电子课件、习题解答、源代码本书特色&#xff1a;★精选例题&#xff0c;引入了大量趣味性、游戏性应用实例&#xff0c;注重与加强程序阅读、参考、编写和上机调试实践的能力&#xff0c;重在编程思路的培养与训练。★概念清晰但不烦琐&#xff1…

***指定网站

1.***指定网站&#xff1b;查找SQL注入点&#xff1b;碰到网站地址是以asp&#xff1f;44.php&#xff1f;44.等结尾的动态网页注入大家自己在论坛搜索资料。关键词SQL。 这里讲些小经验&#xff0c;有的网页如http://www.***.com/article/today/265501.html大家知道以HTML结尾…

聊一聊如何在.NET Core中使用Nacos 2.0

前言 随着 nacos 2.0.0 正式发布&#xff0c;老黄这边也跟着发布了 1.0.2 版本的 nacos-sdk-csharp。下面简单聊一下相关的使用。纯 SDK 的使用 首先要安装 nuget 包<PackageReference Include"nacos-sdk-csharp" Version"1.0.2" />这里有一点要注意…

c语言格式字符If,C语言所有语句格式 C语言中的的if语句共有多少种格式?

导航&#xff1a;网站首页 >C语言所有语句格式 C语言中的的if语句共有多少种格式&#xff1f;C语言所有语句格式 C语言中的的if语句共有多少种格式&#xff1f;相关问题:匿名网友:1.if语句&#xff1a;if(Bool表达式)&#xff5b;如果表达式为true,执行此表达式&#xff5d;…

听说你刚转了Java?准备转回.NET吧!

牛年跳槽季如火如荼&#xff0c;敏锐点的小伙伴儿应该都留意到了&#xff0c;BAT新年都在招聘.NET。2020年11月份发布.NET5统一了七大应用方向&#xff0c;.NET6的2个预览版已经把Blazor升级、跨平台UI方案MAUI、CLR性能优化等都放出来了&#xff0c;.NET前景充满想象&#xff…

poj2253

dijkstra 把存最短距离的数组改为存储frog distance即可 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> using namespace std;const int maxn 201, inf 1000000000;struct point {int x, y;…

一个人开始废掉的3种迹象

1作家李尚龙说&#xff1a;“在大城市里&#xff0c;搞废一个人的方式特别简单。给你一个安静狭小的空间&#xff0c;给你一根网线&#xff0c;最好再加一个外卖电话。好了&#xff0c;你开始废了。”之前的我并不相信人会这么轻易地堕落&#xff0c;直到身边出现了一个真实的例…

WPF 动态更换图片路径

wpf中动态修改图片路径&#xff0c;其实很简单&#xff0c;有个小伙伴有疑问&#xff0c;绑定了source,为什么不能显示图片呢。。。通过绑定&#xff0c;修改图片路径&#xff0c;动态显示图片&#xff0c;效果如下&#xff1a;图片支持本地路径和网络路径&#xff0c;下面就来…

信管专业c语言考什么,计算机信息管理专业卫生事业单位招聘考试笔试模拟题(十)...

关于计算机信息管理专业卫生事业单位招聘考试笔试模拟题&#xff0c;相信很多人都想知道&#xff0c;医学教育网经过搜集整理&#xff0c;特别整理以下内容&#xff0c;希望对您有帮助&#xff01;1、题干&#xff1a;广域网一般采用网状拓扑构型&#xff0c;该构型的系统可靠性…

poj2996

本题是简单的模拟&#xff0c;使用双层vector嵌套存储棋子的位置和种类&#xff0c;然后分别对每个vector进行排序 注意&#xff1a;排序方法为sort(piece[i].begin(), piece[i].end(), cmpWhite); 当然&#xff0c;cmpWhite是比较函数&#xff0c;可以不加比较函数&#xff0c…

听说你在学习算法?清华教授为你准备了一份独家秘籍!

也许您渴望进入国内外IT名企&#xff0c;却屡屡在算法类面试中折戟&#xff0c;苦恼不知如何破解困境&#xff1b;也许您是一位IT工程师&#xff0c;却因为算法能力不足而错过无数次的升职加薪&#xff0c;困扰不知如何突破瓶颈&#xff1b;也许您是一位大学生/中学生&#xff…

一文说通Dotnet操作MongoDB GridFS

补个技术债。这个主题一直在列表中&#xff0c;今天把它补上。还有一个原因&#xff0c;就是网上能查到的代码&#xff0c;大多已经过期了。今天写的&#xff0c;是按最新的SDK做的例子。一、MongoDB GridFS先说说 GridFS。MongoDB 是用 Bson 来存储数据的&#xff0c;每一行数…

linux path减少,Linux的环境变量PATH中所带来的问题及解决方法

Linux的环境变量PATH中所带来的问题及解决方法发布时间:2006-01-07 10:08:27来源:红联作者:yo本文主要讲述“.”在LINUX的环境变量PATH中所带来的问题&#xff0c;及解决的几种方法。正如很多人所知道的$PATH环境变量里存着一张目录列表&#xff0c;当用户要执行某一程序时&…

用VirtualWifi软件实现无线网卡同时连接多个AP。

2019独角兽企业重金招聘Python工程师标准>>> 用VirtualWifi软件实现无线网卡同时连接多个AP。 随着信息技术的发展&#xff0c;越来越多的人开始使用便捷的无线路由器&#xff08;AP&#xff09;组建家庭局域网。当你发现你周围有多个AP可以连接的时候&#xff0c;是…

职场感悟

1&#xff0c;尽量避免到有香港人和新加坡人做上司的外企&#xff0c;不是偏见&#xff0c;是很多事实的经验&#xff0c;不信你可以自己去尝试下&#xff0c;不过不要怪我没提醒过你。 2&#xff0c;不要去有第三方人事代理的外企&#xff0c;比如某人事会告诉你&#xff0c;你…

C语言 time函数 开销,C语言: 函数调用的开销

初学C语言的时候&#xff0c;我们有时会听说函数调用会有一定的开销&#xff0c;在进行了进一步学习之后&#xff0c;我们来看看原来听说的开销指的什么。下面是两个非常简单的样例&#xff0c;就不作解释了&#xff1a;函数调用版本C程序&#xff1a;#include int sum(int a, …

机器学习萌新必学的Top10算法

导读&#xff1a;在机器学习领域里&#xff0c;不存在一种万能的算法可以完美解决所有问题&#xff0c;尤其是像预测建模的监督学习里。所以&#xff0c;针对你要解决的问题&#xff0c;最好是尝试多种不同的算法。并借一个测试集来评估不同算法之间的表现&#xff0c;最后选出…

NET问答: C# 中有哪些 HttpPost 工具包

咨询区 Hooch&#xff1a;我会用 GET Request&#xff0c;但如何使用 Post Request 还得请教大家。回答区 Evan Mulawski&#xff1a;有多种方式可以使用 Http 的 GET 和 Post 请求。A方法&#xff1a;HttpClient (推荐)HttpClient 可用于 .NET Framework 4.5, .NET Standard 1…