当前位置: 首页 > news >正文

LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别

在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() 。
例如:

string strcon = "Data Source=.\\SQLEXPRESS;Initial Catalog=Db_Example;Persist Security Info=True;User ID=sa;Password=sa";
SqlConnection con = new SqlConnection(strcon);
con.Open();
string strsql = "select * from SC,Course where SC.Cno=Course.Cno";
SqlDataAdapter da = new SqlDataAdapter(strsql,con);
DataSet ds = new DataSet();
da.Fill(ds, "mytable");
DataTable tables=ds.Tables["mytable"]; //创建表
var dslp = from d in tables.AsEnumerable() select d;//执行LINQ语句,这里的.AsEnumerable()是延迟发生,不会立即执行,实际上什么都没有发生
foreach(var res in dslp)                
{
     Response.Write(res.Field<string>("Cname").ToString());
}

上述代码使用LINQ 针对数据集中的数据进行筛选和整理,同样能够以一种面向对象的思想进行数据集中数据的筛选。在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ 的查询操作

.AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。
下面就是.AsEnumerable()与相对应的.AsQueryable()的区别:
AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中
AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。

    • .AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。
    • .ToList()立即执行
    • 当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable
    • .AsEnumerable()虽然延迟执行,但还是访问数据库,而.ToList()直接取得结果放在内存中。比如我们需要显示两个部门的员工时,部门可以先取出放置在List中,然后再依次取出各个部门的员工,这时访问的效率要高一些,因为不需要每次都访问数据库去取出部门。
    • IQueryable实现了IEnumberable接口。但IEnumerable<T> 换成IQueryable<T>后速度提高很多。原因:
    • IQueryable接口与IEnumberable接口的区别:  IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
    • IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。

相关文章:

  • 2017阅读计划
  • svnserve+ssh服务器Apache+svn服务器创建
  • nginx proxy_pass代理小结
  • Charles抓取android设备http信息
  • 2016 年 Linux 领域的十大新闻,你有关注吗?
  • C#学习基础--静态构造函数
  • Hadoop 2.6.0 HA高可用集群配置详解
  • PHP Socket 编程过程详解
  • 强名称(3)强名称的脆弱性
  • 写代码的正确姿势
  • 从用户的视角看待网页设计(三)
  • 源码安装ncurses-devel
  • update-alternatives——linux软件版本管理命令
  • 自适应css和屏幕探测
  • php5.3 php-fpm 开启 关闭 重启
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • AngularJS指令开发(1)——参数详解
  • fetch 从初识到应用
  • JAVA SE 6 GC调优笔记
  • Javascript Math对象和Date对象常用方法详解
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Map集合、散列表、红黑树介绍
  • Protobuf3语言指南
  • React中的“虫洞”——Context
  • vue自定义指令实现v-tap插件
  • 高度不固定时垂直居中
  • 每天一个设计模式之命令模式
  • 入口文件开始,分析Vue源码实现
  • 入门级的git使用指北
  • 1.Ext JS 建立web开发工程
  • Java数据解析之JSON
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Z0458. 树的中心2
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (30)数组元素和与数字和的绝对差
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (9)STL算法之逆转旋转
  • (阿里云万网)-域名注册购买实名流程
  • (第61天)多租户架构(CDB/PDB)
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)jQuery 基础
  • (转)shell调试方法
  • (转)菜鸟学数据库(三)——存储过程
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *上位机的定义
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Core中的去虚
  • .net 使用ajax控件后如何调用前端脚本
  • @DependsOn:解析 Spring 中的依赖关系之艺术
  • @Documented注解的作用
  • @RestControllerAdvice异常统一处理类失效原因
  • @拔赤:Web前端开发十日谈