IQueryable和IEnumerable
使用EF你必须知道这两个的区别,可以帮助我们的提升性能。
表达树:Linq 表达
①IQueryable和IEnumerable
IQueryable
延时执行;扩展方法接受的是Expression(必须要能转成sql,否则报错)
IEnumerable
延时执行;扩展方法接受的是Func(C#语法)
②AsEnumerable() 和 ToList() 的区别
ToList()
立即执行,加载数据到内存中。
AsEnumerable()
延迟执行,真正使用时才加载数据。对IQueryable对象使用AsEnumerable()后,仍然是延迟执行
③IQueryable继承自IEnumerable,所以对于数据遍历来说,它们没有区别。
1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功
使用IEnumerable,所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,只是在内存中进行过滤和排序操作。
2.IQueryable却总能只提供你所需要的数 据.大大减少了数据的传输
IQueryable的优势是它有表达式树,所有对于IQueryable的过滤,排序等操作,都会先缓存到表达式树中,只有当真正遍历发生的时候,才会将表达式树由IQueryProvider执行获取数据操作。
注:foreach针对的是数据集整体对象(枚举器?)。当使用foreach时,不管是iq对象还是ie对象,它们都是查询数据库一次,然后开始循环,直至循环结束。不过,当后续再次使用iq对象或ie对象的具体数据时,它们仍然会再次查询数据库。
列如:
[HttpGet]
public async Task<IHttpActionResult> Init3()
{
IQueryable<JoinA> joins = db.JoinAs.Where(x => x.ACode == "");
var joins2 = joins.Where(x=>x.AName.Contains("测试"));
foreach (var item in joins2)
{
Console.WriteLine(item.Id);
}
IEnumerable<JoinA> joinsE = db.JoinAs.Where(x => x.ACode == "").AsEnumerable();
var joinsE2 = joinsE.Where(x => x.AName.Contains("测试"));
foreach (var item in joinsE2)
{
Console.WriteLine(item.Id);
}
return await Task.FromResult(Ok(""));
}
SQL Server Profiler工具 查看我们的sql语句
IQueryable:会拼接我们的sql,最后执行
IEnumerable:先查询到内存中,然后进行操作
SQL Server Profiler工具: https://www.cnblogs.com/kissdodog/p/3398523.html
最新文章
- 12306火车票查询--python
- 模块化开发--sea.js
- 自然数n的分解
- HDU 5918 KMP/模拟
- RichTextBox 右键显示 ContextMenuTrip 分类: C# 2014-10-16 10:43 337人阅读 评论(0) 收藏
- java项目导出jar文件时指定main方法的类
- sql server 各种函数
- web浏览器中的javascript 1
- JDK 安装环境配置(ubuntu)
- Eclipse在点击运行后不能自动保存的解决
- .net 职责链来实现 插件模式
- linux deepin 12.12.1和Windows 7双系统修改默认启动项
- 欢迎来到Devil_lixu的技术博客
- C#实现rabbitmq 延迟队列功能
- RH2288V3服务器 硬件安装以及更换硬件
- Auzre系列1.1.1 —— 安装用于 IntelliJ 的 Azure 工具包
- [skill][http] http管道化连接
- sitecore系统教程之限制对客户端的访问
- Spring Boot(九):定时任务
- Python random模块sample、randint、shuffle、choice随机函数
热门文章
- Thymeleaf学习记录(6)--迭代及条件语法
- vue项目性能优化(路由懒加载、gzip加速、cdn加速)
- 关于beginPath()和closePath()的关系>;>;canvas的beginPath和closePath分析总结,包括多段弧的情况
- 004bean作用域
- 002Conditional条件化创建bean
- CentOS6.5(3)----设置自己安装的程序开机自动启动
- No toolchains found in the NDK toolchains folder for ABI with prefix: arm-linux-androideabi
- [算法练习]String to Integer (atoi)
- 浅谈搜索引擎SEO(HTML/CSS)
- Spring IOC (DI-依赖注入)