linq中AsEnumerable和AsQueryable的區別


本文導讀:用Linq來操作集合的時候會用到AsQueryable()和AsEnumerable(),何時該用AsQueryable()和何時該用AsEnumerable(),或許存在些疑惑。AsQueryable是在數據庫中查詢再返回數據,AsEnumerable是從數據庫讀取全部數據再在程序中查詢。

在使用LINQ 進行數據集操作時,LINQ 不能直接從數據集對象中查詢,因為數據集對象不支持LINQ 查詢,所以需要使用AsEnumerable 方法返回一個泛型的對象以支持LINQ 的查詢操作。

例如

 
C# 代碼    復制
     
     
     
             

string strcon = "Data Source=.\\\\SQLEXPRESS;Initial Catalog=Db_Example;Persist Security Info=True;User ID=sa;Password=sa"; SqlConnection con = new SqlConnection(strcon); con.Open(); string strsql = "select * from SC,Course where SC.Cno=Course.Cno"; 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() select d;//執行LINQ語句,這里的.AsEnumerable()是延遲發生,不會立即執行,實際上什么都沒有發生 foreach(var res in dslp) 

 

一、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()) 

服務器端sql

 
SQL 代碼    復制
     
     
     
             

--AsQueryable  Select [Extent1].[id] AS [id] FROM [dbo].[User] AS [Extent1] Where [Extent1].[id] > 10  --AsEnumerable Select [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()) 

 

服務器端sql

 
SQL 代碼    復制
     
     
     
             

--AsQueryable Select TOP (20) [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] > 10 ) AS [Filter1] Where [Filter1].[row_number] > 20 orDER BY [Filter1].[id] ASC  --AsEnumerable Select [Extent1].[id] AS [id], [Extent1].[usn] AS [usn], [Extent1].[pwd] AS [pwd], [Extent1].[created] AS [created] FROM [dbo].[User] AS [Extent1]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM