解释查询和本地查询 区分 Enumerable 和 Queryable
简单介绍:Enumerable 和 Queryable 他们都是静态类,位于命名控件 System.Linq下,分别为IEnumerable<T>和IQueryable<T>提供方法扩展。关于扩展方法请查看:.NET扩展方法一章
Enumerable 为 IEnumerable<T> 泛型接口提供扩展。Queryable为IQueryable<T>泛型接口提供扩展,IQueryable接口继承了IEnumerable接口,这两个接口具有几乎相同的签名,但是执行方式大不相同。

先来看一下我们的表结构:

现在,我们查询分数大于80分的学生:分析下面两句代码
IEnumerable<Student> query1 = db.Student.Where(s => s.Score >= 80);
IEnumerable<Student> query2 = db.Student.AsEnumerable().Where(s => s.Score >= 80);
虽然返回类型都是 IEnumerable<T>,他们的执行原理有什么不同?
情况一:

using (var db = new Entities())
{
IQueryable<Student> query1 = db.Student.Where(s => s.Score >= 80); foreach (var st in query1)
{
Console.WriteLine(st.StudentName + st.Score);
}
}

追踪SQL:

说明:上面的实例实际上是调用Queryable中定义的扩展方法,将查询条件解析为查询表达式数,最终转换成sql语句执行。
情况二:

using (var db = new Entities())
{
IEnumerable<Student> query1 = db.Student.AsEnumerable().Where(s => s.Score >= 80); foreach (var st in query1)
{
Console.WriteLine(st.StudentName + st.Score);
}
}

追踪SQL:

说明:我们调用了AsEnumerable方法,下面是MSDN的解释:

通俗点讲,就是:AsEnumerable方法为我们提供了一种选择,选择分2种:
1.不调用AsEnumerable方法时:将查询条件解析为表达式树,实际调用 Queryable类中的Where方法

此时执行的SQL是:

程序将查询条件转化为了最终的SQL语句,发送到远程数据库查询。
2.调用AsEnumerable方法时: 将查询条件视为一个委托,实际调用 Enumerable类中的Where方法

此时执行的SQL是:

程序实际上是先将 所有学生数据全部取出,在内存中进行过滤。
这两种方式都是延迟执行,遍历元素的时候才会真正的去查询数据库,执行结果如下:

注意:AsEnumerable方法要在查询方法之前调用,如下的方式执行的结果与不调用AsEnumerable没差别,仍然执行Queryable中的方法。
IEnumerable<Student> query1 = db.Student.Where(s => s.Score >= 80).AsEnumerable();
补充:另一个方法AsQueryable定义在Queryable静态类中,是将实现了IEnumerable<T>接口的对象转化为 IQueryable<T>对象,
下面是MSDN给出的例子:

List<int> grades = new List<int> { 78, 92, 100, 37, 81 };
// Convert the List to an IQueryable<int>.
IQueryable<int> iqueryable = grades.AsQueryable();
// Get the Expression property of the IQueryable object.
System.Linq.Expressions.Expression expressionTree =
iqueryable.Expression;
Console.WriteLine("The NodeType of the expression tree is: "
+ expressionTree.NodeType.ToString());
Console.WriteLine("The Type of the expression tree is: "
+ expressionTree.Type.Name);

执行结果:

到数据源你不清楚是IEnumerable还是IQueryable时,调用AsQueryable方法。
解释查询和本地查询 区分 Enumerable 和 Queryable的更多相关文章
- 【EF学习笔记12】----------解释查询和本地查询 区分 Enumerable 和 Queryable
简单介绍:Enumerable 和 Queryable 他们都是静态类,位于命名控件 System.Linq下,分别为IEnumerable<T>和IQueryable<T>提 ...
- linq和EF查询的用法和区分
我们做项目时,难免会遇到用的不知道是啥,及把linq和EF搞混了 今天我带领大家梳理下思路: 首先说linq查询,然后介绍EF查询 1.linq查询 当我们使用linq查询时,转到定义会调到Query ...
- Hibernate之QBC查询与本地SQL查询
1. QBC查询: QBC 查询就是通过使用Hibernate提供的QueryByCriteria API 来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口 ...
- 写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接内容的本地查询
始出处:http://www.cnblogs.com/Charltsing/p/APIViewer.html QQ:564955427,QQ群:550672198 世面上的API Viewer已经不少 ...
- Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加
Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...
- MySQL之多表查询一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习
MySQL之多表查询 阅读目录 一 介绍 二 多表连接查询 三 符合条件连接查询 四 子查询 五 综合练习 一 介绍 本节主题 多表连接查询 复合条件连接查询 子查询 首先说一下,我们写项目一般都会建 ...
- hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询
在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询..... 1.hql聚合函数,先大致列一下hql的聚合函数有哪些吧: 在 ...
- mysql查询、子查询、连接查询
mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.gr ...
- mysql 子句、子查询、连接查询
一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count( ...
随机推荐
- vue常用插件之打印功能、二维码插件、批量打印二维码
vue实现打印的两种方法 vue实现批量打印二维码 (需安装二维码插件qrcodejs2) 一.vue-print-nb插件 1.安装: npm i vue-print-nb -S 2.全局注册(ma ...
- CSS: inline、block和inline-block的区别
block 块级元素特点: 1.每个块级元素都从新的一行开始,并且其后的元素也另起一行.(很霸道,一个块级元素独占一行) 2.元素的高度.宽度.行高以及顶和底边距都可设置. 3.元素宽度在不设置的情况 ...
- The Number of Inversions
For a given sequence A={a0,a1,...an−1}A={a0,a1,...an−1}, the number of pairs (i,j)(i,j) where ai> ...
- MCPS & MIPS
MIPS:Million Instructions Per Second MCPS:Million Cycles Per Second MIPS = Total Instructions*Sampli ...
- 机器学习笔记(十一)OCR技术的应用
1.介绍OCR: OCR(Photo optical character recognition 照片光学字符识别) 应用于读取电子照片中的文字. 2.算法思路: ① 识别文字区域: ② 字符切分: ...
- 占位 SC
占位 SC include: SC404 SC405
- vm virtualbox 里的ubuntu挂载windows的文件夹
1.先在virtualbox里设置好共享文件夹 如右图所示: 共享文件夹-添加共享文件夹 里面: 选择好 共享文件夹路径,起好 共享文件夹名称,下面都不用选. 假设共享文件名是ShareD, 2. 然 ...
- Xlrd模块读取Excel文件数据
Xlrd模块使用 excel文件样例:
- js前端模块化的前世今生
前言: <!DOCTYPE html> <html> <head> <title></title> </head> <sc ...
- day04_1hibernate
log4j的整合.一对一关系的操作.二级缓存的介绍 一.log4j的整合: 1.介绍什么是 slf4j 核心jar : slf4j-api-1.6.1.jar .slf4j是日志框架,将其他优秀的日 ...