您现在的位置是:首页 > 正文

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

2024-04-01 00:15:05阅读 2

在写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,强制从数据库中读取所有数据到内存先。

网站文章

  • java实现涂格子游戏(附完整源码)

    java实现涂格子游戏(附完整源码)

    2024-04-01 00:14:59
  • 解决Ubuntu网络图标突然消失的问题

    解决Ubuntu网络图标突然消失的问题

    大学生的日常发现问题并解决问题环节!!!!由于我的Ubuntu已经解决该问题了,所以我直接给大伙上最有效的方法。基本上网络图标不见了都是Ubuntu的NetworkManager有问题,那么,我们要怎么解决呢?

    2024-04-01 00:14:52
  • 实时数仓之 Kappa 架构与 Lambda  架构(建议收藏!)

    实时数仓之 Kappa 架构与 Lambda 架构(建议收藏!)

    大家好,我是土哥.2021 年 1月份,给大家重点分享一下离线数仓与实时数仓的内容。今天,我们先了解一下数据仓库架构的演变过程,本文主要从五个方面进行介绍数据仓库概念离线大数据架构Lamb...

    2024-04-01 00:14:27
  • EMNLP2023 | 通过跨语言提示改进零样本 CoT 推理能力

    EMNLP2023 | 通过跨语言提示改进零样本 CoT 推理能力

    论文名称:Cross-lingual Prompting: Improving Zero-shot Chain-of-Thought Reasoning across Languages论文作者:覃立...

    2024-04-01 00:14:21
  • 设计短网址系统

    链接:https://www.zhihu.com/question/29270034/answer/46446911自增策略通过发号,给每一个过来的长地址,发一个号即可,小型系统直接用mysql的自增...

    2024-04-01 00:14:16
  • redid过期策略_Redis数据过期策略

    1、Redis中key的的过期时间通过EXPIRE key seconds命令来设置数据的过期时间。返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间。在key上设置了过期时间后key...

    2024-04-01 00:13:51
  • 清除缓存代码_清除代码著名报价。

    清除缓存代码The phrase “software engineering” was terms at conferences organized by NATO in 1968 and 1969 ...

    2024-04-01 00:13:44
  • Flutter 实现上拉加载更多数据,下拉刷新

    Flutter 实现上拉加载更多数据,下拉刷新

    引言 昨天已经使用 RefreshIndicator 实现了下拉刷新数据的效果,今天,我们使用ScrollController来实现:上拉加载更多数据,然后再将二者汇总起来~~ 废话不多说,上菜,哦,不对,上图

    2024-04-01 00:13:37
  • Docker学习笔记(五)-Docker Compose

    Docker学习笔记(五)-Docker Compose

    背景很多应用是很复杂的,需要多个容器共同支持,任何复杂的系统可能需要启动的容器数量也很庞大,我们需要从Dockerfile build image或者docker hub拉取多个image,要创建并管理多个container,这个工作量是巨大的,docker compose应运而生。Docker Compose是什么Docker Compose帮我们启动错综复杂的容器,开发测试人员...

    2024-04-01 00:13:31
  • [Git高级教程 (一)] 通过Tag标签回退版本修复bug

    1 前言本系列之所以取名”Git高级教程”,主要是教大家解决实际工作中遇到的问题,要求读者会基本的Git用法和命令,请不要使用SourceTree这样的工具,因为它让你啥都不会、啥也不懂,git本身与Linux一脉相承,都是Linus torvalds写的嘛,所以命令行才是精髓。如果你还不会Git的话,强烈建议你学习廖雪峰的教程,简单易懂: 廖雪峰的Git教程: http://www.li

    2024-04-01 00:13:11