LINQ使用细节之.AsEnumerable()和.ToList()的区别
先看看下面的代码,用了 .AsEnumerable():

1 var query = (from a in db.Table
2 where a = SomeCondition
3 select a.SomeNumber).AsEnumerable();
4
5 int recordCount = query.Count();
6 int totalSomeNumber = query.Sum();
7 decimal average = query.Average();

运行起来发现执行了3次而不是1次,查询了3次数据库可不是什么好事情。如果把第一行换成.ToList()那就是只查询一次数据库。
.AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行,例如下面的代码:

1 DataTable orders = ds.Tables["SalesOrderHeader"];
2
3 // Query the SalesOrderHeader table for orders placed
4 // after August 8, 2001.
5 IEnumerable<DataRow> query =
6 from order in orders.AsEnumerable()
7 where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
8 select order;
9
10 // Create a table from the query.
11 DataTable boundTable = query.CopyToDataTable<DataRow>();
12
13 // Bind the table to a System.Windows.Forms.BindingSource object,
14 // which acts as a proxy for a System.Windows.Forms.DataGridView object.
15 bindingSource.DataSource = boundTable;

但也不应滥用.ToList(),当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable,例如下例:

1 using (BlogDbContext context = new BlogDbContext())
2 {
3 var result = (from e in context.BlogEntries
4 join t in context.PostTexts
5 on e.ID equals t.ID
6 where e.ID == entryId
7 select new
8 {
9 Title = e.Title,
10 Body = t.Text
11 })
12 .ToList()
13 .Select(e => new BlogEntry() { Title = e.Title, Body = e.Body })
14 .FirstOrDefault();
15 }

该例子中的中间结果并没有使用,所以.ToList()可以改为.AsEnumerable()。
.AsEnumerable() 和 .ToList() 的区别:
- .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,强制从数据库中读取所有数据到内存先。

1 namespace System.Linq
2 {
3 public interface IQueryable : IEnumerable
4 {
5 Type ElementType { get; }
6
7 Expression Expression { get; }
8
9 IQueryProvider Provider { get; }
10 }
11
12 public interface IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable
13 {
14 }
15 }

LINQ使用细节之.AsEnumerable()和.ToList()的区别的更多相关文章
- IQueryable和IEnumerable以及AsEnumerable()和ToList()的区别
注意:本文背景为 Linq to sql .文中ie指代IEnumerable,iq指代IQueryable. IQueryable 和 IEnumerable 的区别 IQueryable 延时执行 ...
- Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法:在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和T ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
MVC+Spring.NET+NHibernate .NET SSH框架整合 在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...
- LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别
LINQ语句中的.AsEnumerable() 和 .AsQueryable()的区别 在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() .例如: s ...
- linq中AsEnumerable和AsQueryable的区别
本文导读:用Linq来操作集合的时候会用到AsQueryable()和AsEnumerable(),何时该用AsQueryable()和何时该用AsEnumerable(),或许存在些疑惑.AsQue ...
- LINQ中AsEnumerable与AsQueryable的区别
AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中:AsQueryable将一个序列向下转换为一个IQuery ...
- 学习axios必知必会(2)~axios基本使用、使用axios前必知细节、axios和实例对象区别、拦截器、取消请求
一.axios的基本使用: ✿ 使用axios前必知细节: 1.axios 函数对象(可以作为axios(config)函数使用去发送请求,也可以作为对象调用方法axios.request(confi ...
- java细节篇(==和equals的区别)
1)当==两边是对象时(String,Integer...),两边比的都是地址2)当==两边是基本类型时(int,float),两边比的都是值3)默认equals比的是对象的地址,但是重写的话可以改变 ...
- LinQ高级查询
1.模糊查询 con.Users.Where(a =>a.UserName.Contains(name)).ToList(); //包含name con.Users.Where(a =>a ...
随机推荐
- PHP两个文件的相对路径
/** * relativePath 计算两个文件的相对路径 * @param file1 参作为考路径 * @param file2 相对于$file1的路径 */ function relativ ...
- HDU 2243 考研路茫茫——单词情结(AC自动机+DP+快速幂)
题目链接 错的上头了... 这题是DNA的加强版,26^1 +26^2... - A^1-A^2... 先去学了矩阵的等比数列求和,学的是第二种方法,扩大矩阵的方法.剩下就是各种模板,各种套. #in ...
- Linux安装软件时缺少依赖包的简单较完美解决方法!
大家在linux下源码安装时,有木有经常碰到缺少这个包那个包的,然后不知所措?看到最近有几个筒子安装thrift,安装python因缺少依赖包而进行不下去了.我用的是红帽,装系统的时候习惯把所有的有的 ...
- SqlServer操作大全
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...
- asp.net在线预览txt文件(简单实现)
最近在做文件的在线预览,发现txt文件没有一个较好的方法去实现,想了想可能是比较简单就直接在后台输出了 txt文件
- Java学习_int和Integer的区别+包装类
1.Java 中的数据类型分为基本数据类型和引用数据类型 int是基本数据类型,Integer是引用数据类型: Ingeter是int的包装类,int的初值为0,Ingeter的初值为null. 2. ...
- 使用File类列出指定位置的文件信息,包含该路径子目录下的文件信息
public class Test{ public static void main(String [] args) { File f=new File("d:"); File [ ...
- 马克飞象 Markdown 使用和学习
第三方学习网站 http://sspai.com/25137https://maxiang.io/ 使用工具:有道云笔记 https://note.youdao.com/ 新建时使用Mardown类型 ...
- jenkins使用git SCM时changelog乱码(Jenkins部署在Linux上,任务在Windows Slave上构建)
问题原因 changelog的获取方式(git-client插件): 首先调用git whatchanged命令,读取输出字节流(UTF-8编码的Commit Message). 将字节流解码为字符串 ...
- html css 样式继承的问题
body 设置css中可以继承的属性:letter-spacing.word-spacing.white-space.line-height.color.font等 但有时,body的样式,不能在有的 ...