Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
时间:2018-12-09
本文章向大家介绍Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法,主要包括Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法相关应用实例、知识点总结和注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法:
在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和ToList()的用法,三者有何区别呢?以下是我的理解,有毛病请大家指教!
在System.Linq命名空间下,有两个静态类:
Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展;
Queryable类,针对继承了IQueryable<T>接口的集合进行扩展。
一、AsQueryable():
先说说什么是 IQueryable,AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
1,lazy load 特性
以下是一段最常见的代码:
var products = db.Product.where(p => p.Type == "food").select(p => new { p.Id, p.Name, p.CreateTime});
注意:Select() 的返回类型为 IQueryable,为 IQueryable<T>, 语句执行后不会立刻查询数据库, 而是在迭代使用 products 时才会查数据库, 具有 lazy load 的特性, 按需查数据库可提高程序效率。
在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和ToList()的用法,三者有何区别呢?以下是我的理解,有毛病请大家指教!
在System.Linq命名空间下,有两个静态类:
Enumerable类,它针对继承了IEnumerable<T>接口的集合进行扩展;
Queryable类,针对继承了IQueryable<T>接口的集合进行扩展。
一、AsQueryable():
先说说什么是 IQueryable,AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
1,lazy load 特性
以下是一段最常见的代码:
var products = db.Product.where(p => p.Type == "food").select(p => new { p.Id, p.Name, p.CreateTime});
注意:Select() 的返回类型为 IQueryable,为 IQueryable<T>, 语句执行后不会立刻查询数据库, 而是在迭代使用 products 时才会查数据库, 具有 lazy load 的特性, 按需查数据库可提高程序效率。
2,高程序效率.
迭代时上面的代码类似于下面的 sql 语句:
select Id, Name, CreateTime from Product where Type = 'food'
对 products 再次使用数据库查询操作, 运行时会把结果合并为1条 sql 语句, 如下,
var products = db.Product.where(p => p.Type == "food").select(p => new { p.Id, p.Name, p.CreateTime});
var orderedProducts = products.OrderBy(p => p.CreateTime);
迭代时生成的 sql 语句类似:
select Id, Name, CreateTime from Product where Type = 'food' order by CreateTime
IQueryable 有诸多限制, 只支持数据库查询语法, 无法支持 Linq to object 的操作, 是LINQ TO SQL。
结论:AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
迭代时生成的 sql 语句类似:
select Id, Name, CreateTime from Product where Type = 'food' order by CreateTime
IQueryable 有诸多限制, 只支持数据库查询语法, 无法支持 Linq to object 的操作, 是LINQ TO SQL。
结论:AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
二、AsEnumerable()
同样支持 lazy load,是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。 但不要滥用。迭代时遇到 AsEnumerable() 会先进行 sql 查询, 但是, 千万不要为了方便而滥用 AsEnumerable(), 可能会严重消耗资源,能进行 Linq to object 操作。
同样支持 lazy load,是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。 但不要滥用。迭代时遇到 AsEnumerable() 会先进行 sql 查询, 但是, 千万不要为了方便而滥用 AsEnumerable(), 可能会严重消耗资源,能进行 Linq to object 操作。
eg:var products = db.Product.AsEnumerable().Select(p => new {p.Id, p.Name, p.CreateTime.Date});
对IQueryable对象使用AsEnumerable()后,仍然是延迟执行,不过此时对象本质已经变了。
上面的代码在查询时会把整个Product表的结果存放进内存, 然后进行 .Select 查询,严重消耗资源。
结论:AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。
上面的代码在查询时会把整个Product表的结果存放进内存, 然后进行 .Select 查询,严重消耗资源。
结论:AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。
AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。
注意:IQueryable实现了IEnumberable接口。但IEnumerable<T> 换成IQueryable<T>后速度提高很多。
IQueryable接口与IEnumberable接口的区别:
IQueryable接口与IEnumberable接口的区别:
IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
三、ToList()
调用 ToList() 会立刻查询并保存结果, 而不会等到迭代时才查询,作用和 lazy load 是相反的。
在需要得到完整结果后, 再处理的场景, 需要使用 ToList()。
调用 ToList() 会立刻查询并保存结果, 而不会等到迭代时才查询,作用和 lazy load 是相反的。
在需要得到完整结果后, 再处理的场景, 需要使用 ToList()。
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
- ASP.NET MVC的View是如何被呈现出来的?[设计篇]
- Python大牛告诉你一行代码能干什么?神奇
- 谷歌最新人工智能研究:仅利用稀疏轮廓位置“重构”图像
- DATUM和BigchainDB
- MySQL主从复制的实现过程
- 使用dict和set
- 区块链技术(二):以太坊编程语言Solidity安装及入门初体验
- SQL注入测试神器sqlmap
- 人工智能也分强与弱?
- 【Scikit-Learn 中文文档】集成方法 - 监督学习 - 用户指南 | ApacheCN
- 2017黑科技 颠覆生活哪家强?
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【解读ServiceCallSite 】
- ASP.NET MVC的View是如何呈现出来的[实例篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript 异步编程
- R海拾遗-图片拼接
- 基于SSH框架的人力资源管理系统设计与实现
- Flutter/Dart中的异步
- UTM坐标的遥感图,Python终于把它扶正啦(手动狗头)
- Flutter框架分析(一)-- 总览和Window
- R海拾遗-sci配色
- Flutter框架分析(二)-- 初始化
- Flutter框架分析(三)-- Widget,Element和RenderObject
- 傅里叶变换的图像应用--学好了用处大~
- Flutter框架分析(四)-- Flutter框架的运行
- R海拾遗-流程图prismadiagramR
- R海拾遗-单项重复测量方差分析
- R海拾遗-双因素重复测量方差分析
- 小白秒变大神--windows窗口+装B神器大全 两部曲