LINQ汽车导航使用细节注意之.AsEnumerable和.ToList的区别

安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&求助:关于LINQ TO SQL和LINQ TO OBJECT配合使用的效率问题
求助:关于LINQ TO SQL和LINQ TO OBJECT配合使用的效率问题
在做项目的时候遇到了一个问题有两个结果集,一个是用LINQ TO SQL取出来的Q1,数据量大概有300条左右还有一个结果集是用LINQ TO OBJECT从一个DATATABLE中取出来的Q2,数据量20条然后想关联Q1 Q2取出最终结果开始发现是无法直接关联的于是本人将两个结果集全部AsEnumerable()之后发现功能可以实现了但是速度非常慢执行一次大约需要20秒左右请问这是怎么回事,如何可以优化一下补充一下,Q1 Q2两个查询是没有问题的,很快都能取出结果就是最后关联的时候非常慢叩谢……
昵称: dhjyxia01 &时间:
昵称: q &时间:專刋分享內文您的位置: >
linq中AsEnumerable和AsQueryable的区别
学习标签:
本文导读:用Linq来操作集合的时候会用到AsQueryable()和AsEnumerable(),何时该用AsQueryable()和何时该用AsEnumerable(),或许存在些疑惑。AsQueryable是在数据库中查询再返回数据,AsEnumerable是从数据库读取全部数据再在程序中查询。
在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ 的查询操作。
C# 代码 &&复制
string strcon = &Data Source=.\SQLEXPRESS;Initial Catalog=Db_EPersist Security Info=TUser ID=Password=sa&;
SqlConnection con = new SqlConnection(strcon);
con.Open();
string strsql = &select * from SC,Course o&;
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()//执行LINQ语句,这里的.AsEnumerable()是延迟发生,不会立即执行,实际上什么都没有发生
foreach(var res in dslp)
Response.Write(res.Field&string&(&Cname&).ToString());
一、linq中AsEnumerable和AsQueryable的区别
1、AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行。
2、AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中。
3、AsQueryable将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。
4、AsEnumerable()延迟执行,不会立即执行。当你调用.AsEnumerable()的时候,实际上什么都没有发生。
5、ToList()立即执行
6、当你需要操作结果的时候,用.ToList(),否则,如果仅仅是用来查询不需要进一步使用结果集,并可以延迟执行,就用.AsEnumerable()/IEnumerable /IQueryable
7、AsEnumerable()虽然延迟执行,但还是访问数据库,而.ToList()直接取得结果放在内存中。比如我们需要显示两个部门的员工时,部门可以先取出放置在List中,然后再依次取出各个部门的员工,这时访问的效率要高一些,因为不需要每次都访问数据库去取出部门。
8、IQueryable实现了IEnumberable接口。但IEnumerable&T& 换成IQueryable&T&后速度提高很多。
9、IQueryable接口与IEnumberable接口的区别:& IEnumerable&T& 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable&T& 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,它并不是把所有数据都加载到内存里来才进行条件过滤。
10、IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先。
二、AsEnumerable和AsQueryable的实例
C# 代码 &&复制
using (testContext context = new testContext())
var query = (from item in context.Users.AsQueryable()
where item.id & <span style="color: #
select item.id).ToList();
var query2 = (from item in context.Users.AsEnumerable()
where item.id & <span style="color: #
select item.id).ToList();
服务器端sql
SQL 代码 &&复制
--AsQueryable
[Extent1].[id] AS [id]
FROM [dbo].[User] AS [Extent1]
Where [Extent1].[id] & <span style="font-weight: color: #
--AsEnumerable
[Extent1].[id] AS [id],
[Extent1].[usn] AS [usn],
[Extent1].[pwd] AS [pwd],
[Extent1].[created] AS [created]
FROM [dbo].[User] AS [Extent1]
C# 代码 &&复制
using (testContext context = new testContext())
var query = (from item in context.Users.AsQueryable()
where item.id & <span style="color: #
orderby item.id ascending
select item.id).Skip(<span style="color: #).Take(<span style="color: #).ToList();
var query2 = (from item in context.Users.AsEnumerable()
where item.id & <span style="color: #
orderby item.id ascending
select item.id).Skip(<span style="color: #).Take(<span style="color: #).ToList();
服务器端sql
SQL 代码 &&复制
--AsQueryable
Select TOP (<span style="font-weight: color: #)
[Filter1].[id] AS [id]
FROM ( Select [Extent1].[id] AS [id], row_number() OVER (ORDER BY [Extent1].[id] ASC) AS [row_number]
FROM [dbo].[User] AS [Extent1]
Where [Extent1].[id] & <span style="font-weight: color: #
AS [Filter1]
Where [Filter1].[row_number] & <span style="font-weight: color: #
orDER BY [Filter1].[id] ASC
--AsEnumerable
[Extent1].[id] AS [id],
[Extent1].[usn] AS [usn],
[Extent1].[pwd] AS [pwd],
[Extent1].[created] AS [created]
FROM [dbo].[User] AS [Extent1]
您可能感兴趣
一月好评排行榜在写LINQ语句的时候,往往会看到.AsEnumerable() 和 .AsQueryable() 。
string strcon = &Data Source=.\\SQLEXPRESS;Initial Catalog=Db_EPersist Security Info=TUser ID=Password=sa&;SqlConnection con = new SqlConnection(strcon);con.Open();string strsql = &select * from SC,Course o&;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()//执行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,强制从数据库中读取所有数据到内存先。
原文地址:/jianglan/archive//2135023.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:79652次
积分:1608
积分:1608
排名:千里之外
原创:81篇
转载:34篇
评论:11条
(2)(9)(6)(4)(4)(2)(9)(12)(6)(1)(2)(1)(6)(4)(11)(7)(2)(1)(1)(7)(8)(9)(1)

我要回帖

更多关于 其他和其它的使用区别 的文章

 

随机推荐