LINQ使用细节之AsEnumerable和ToList的区别Word下载.docx
- 文档编号:22612927
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:3
- 大小:15.87KB
LINQ使用细节之AsEnumerable和ToList的区别Word下载.docx
《LINQ使用细节之AsEnumerable和ToList的区别Word下载.docx》由会员分享,可在线阅读,更多相关《LINQ使用细节之AsEnumerable和ToList的区别Word下载.docx(3页珍藏版)》请在冰豆网上搜索。
7
decimalaverage=query.Average();
运行起来发现执行了3次而不是1次,查询了3次数据库可不是什么好事情。
如果把第一行换成.ToList()那就是只查询一次数据库。
.AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:
First,Single,ToList....的时候)才执行,例如下面的代码:
1DataTableorders=ds.Tables["
SalesOrderHeader"
];
2
3
//QuerytheSalesOrderHeadertableforordersplaced
4
//afterAugust8,2001.
5
IEnumerable<
DataRow>
query=
6fromorderinorders.AsEnumerable()
7whereorder.Field<
DateTime>
("
OrderDate"
)>
newDateTime(2001,8,1)
8selectorder;
9
10
//Createatablefromthequery.
11
DataTableboundTable=query.CopyToDataTable<
();
12
13
//BindthetabletoaSystem.Windows.Forms.BindingSourceobject,
14
//whichactsasaproxyforaSystem.Windows.Forms.DataGridViewobject.
15
bindingSource.DataSource=boundTable;
但也不应滥用.ToList(),当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable
/IQueryable,例如下例:
1using(BlogDbContextcontext=newBlogDbContext())
2{
3varresult=(fromeincontext.BlogEntries
4jointincontext.PostTexts
5one.IDequalst.ID
6wheree.ID==entryId
7selectnew
8{
9Title=e.Title,
10Body=t.Text
11})
12.ToList()
13.Select(e=>
newBlogEntry(){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<
后速度提高很多。
原因:
IQueryable接口与IEnumberable接口的区别:
IEnumerable<
泛型类在调用自己的SKip和Take等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<
是将Skip,take这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
IEnumerable跑的是LinqtoObject,强制从数据库中读取所有数据到内存先。
1namespaceSystem.Linq
3publicinterfaceIQueryable:
IEnumerable
4{
5TypeElementType{get;
}
6
7ExpressionExpression{get;
8
9IQueryProviderProvider{get;
10}
11
12publicinterfaceIQueryable<
outT>
:
IQueryable,IEnumerable
13{
14}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINQ 使用 细节 AsEnumerable ToList 区别