Linq查询IEnumerable与IQueryable
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Stopwatch stp = new Stopwatch(); using(var db = new DBCommonContext();){
stp.Start();
var usser_First = db.tbUsers.Where(p => p.UserID > );//.AsEnumerable();
var users_Now = usser_First.Where(p => p.ModifyDate > new DateTime(, , )); //断点
foreach (var user in users_Now)
{//断点
Console.WriteLine(user.UserName + "\n"); } stp.Stop();
Console.WriteLine("IQueryable执行时间:" + stp.Elapsed.ToString()+"\n");
stp.Reset();
}
Console.ReadKey(); }
}
设置好断点,打开SQL Profiler。分别对两个跟踪,可以看到到第一个断点的时候都还没有去SQL拿数据:

都是延迟执行,从SQL Profiler可以看出都是到foreach才去拿数据。
①、IEnumerable下执行的语句,可以看到去SQL加载过来的是第一个条件下的所有数据,然后扩展方法筛选。本质Linq2object,数据量略大内存占用多,响应速度也略快。

②、IQueryable下的结果,是根据语法书整个合并成sql查询到结果。本质linq2sql,耗损小,但查询效率略慢

组合查询的时候,我们一般会采取IQueryable<T>,最后ToList()的时候才会去数据库拿数据
...........
using (var db = new YourEntitys())
{//linq组合查询
var query = from a in db.YourTable
select a; if (YourTableDto.SystemId>)
{
query = query.Where(p=>p.Id==YourTableDto.Id);
}
if (!string.IsNullOrEmpty(YourTable.Name))
{
query = query.Where(p => p.Name.Contains(YourTableDto.CategoryName));
}
..........
直接总结:
IEnumerable<T> 会直接加载所有数据到内存,然后再筛选。是先从数据库取出数据放入内存,然后在本地调用SKip 和 Take 等扩展方法
在调用自己的Where、SKip 、Take 等扩展方法之前数据就已经加载在本地内存里了。如上按第一个条件直接SQL加载到内存后,再自身执行第二个条件的数据。所以它传输的数据量比较大,所以会有更多的无用功。本质Linq2Object,额外带宽耗损大但速度快占内存。内存的读取速度要高于数据库之间筛选的速度
IQueryable<T> 会先翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
所以在使用ORM、linq等的时候注意这两个接口,考虑好内存
是通过语法树完全转换成一个T-sql语句,最后SQL拿到结果集。只加载需要的数据。本质Linq2SQL。耗损小速度略慢。
选择哪个的问题其实是远程从sql加载数据和本地加载筛选数据的取舍
Linq查询IEnumerable与IQueryable的更多相关文章
- IEnumerable和IQueryable和Linq的查询
IEnumerable和IEnumerable 1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据 ...
- LINQ查询中的IEnumerable<T>和IQueryable<T>
LINQ查询方法一共提供了两种扩展方法,在System.Linq命名空间下,有两个静态类:Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展:Queryab ...
- 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>
建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:E ...
- 2019.03.22 读书笔记 Linq中的IEnumerable与IQueryable
Linq主要分为 Linq to object .Linq to XML .Linq to sql(现在都用EF了). 针对object和sql,微软分别设计了两套接口IEnumerable.IQue ...
- 【C#夯实】我与接口二三事:IEnumerable、IQueryable 与 LINQ
序 学生时期,有过小组作业,当时分工一人做那么两三个页面,然而在前端差不多的时候,我和另一个同学发生了争执.当时用的是简单的三层架构(DLL.BLL.UI),我个人觉得各写各的吧,到时候合并,而他觉得 ...
- C# IEnumerable与IQueryable ,IEnumerable与IList ,LINQ理解Var和IEnumerable
原文:https://www.cnblogs.com/WinHEC/articles/understanding-var-and-ienumerable-with-linq.html 使用LINQ从数 ...
- LinqToDB 源码分析——轻谈Linq查询
LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...
- .NET面试题系列[14] - LINQ to SQL与IQueryable
.NET面试题系列目录 名言警句 "理解IQueryable的最简单方式就是,把它看作一个查询,在执行的时候,将会生成结果序列." - Jon Skeet LINQ to Obje ...
- LINQ 查询表达式(C# 编程指南)
语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言)的基础上. 借助于 LINQ,查询现在 ...
随机推荐
- (转载)INSERT INTO .. ON DUPLICATE KEY 语法与实例教程
(转载)http://www.111cn.net/database/mysql/ON_DUPLICATE_KEY%20.htm INSERT语句末尾指定了ON DUPLICATE KEY UPDATE ...
- 如何配置jdk和tomcat 转
一.配置JDK1.解压JDK至D:\JDK1.5目录下(楼主可以自由选取目录).2.设置环境变量(右键我得电脑->属性->高级->环境变量),在系统变量中添加一个叫JAVA_HOME ...
- TMS320VC5509A DSP学习路线(持续更新)
step 1:芯片的数据手册(data sheet) 参考资料:sprs205k_TMS320VC5509A Fixed-Point Digital Signal Processor Data Man ...
- 4种字符串匹配算法:KMP(下)
回顾:4种字符串匹配算法:BS朴素 Rabin-karp(上) 4种字符串匹配算法:有限自动机(中) 1.图解 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R ...
- [转]linux的ulimit各种限制之深入分析
这是一篇非常好的文章,对ulimit的各个限制参数讲得非常透彻.原文链接:http://home.lupaworld.com/home-space-uid-56821-do-blog-id-23281 ...
- linux mono
linux下.net环境; rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm &am ...
- java基础学习(一)
去年10月份从学校出来实习,从事javaWeb方面的开发.到现在已经快1年了.突然间感觉自己的java基础知识忘记的很厉害,或者说知识掌握的不牢吧.回顾自己学习java,发现我竟然一本关于java基础 ...
- 容斥原理应用(求1~r中有多少个数与n互素)
问题:求1~r中有多少个数与n互素. 对于这个问题由容斥原理,我们有3种写法,其实效率差不多.分别是:dfs,队列数组,位运算. 先说说位运算吧: 用二进制1,0来表示第几个素因子是否被用到,如m=3 ...
- sdut-2725-The Urge to Merge-状压DP
把数组竖起来,从上往下走. 如果当前位置是竖着乘的,那么第一个点标记为1.否则标记为0. 样例最终的状态为: 0 0 1 0 1 0 1 0 0 0 0 0 #include<iostream& ...
- winform 跨窗体给控件传值 分类: WinForm 2014-08-02 16:33 195人阅读 评论(0) 收藏
两个窗体 FormA,FormB; FormA窗体中有一文本框控件:TextBox; FormB窗体中有一变量:txtJSJ 目的:把变量赋值给文本框 实现: 设置TextBox属性: Modifie ...