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

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的實例

using (testContext context = new testContext()) 
服務器端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] 

using (testContext context = new testContext()) 
服務器端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]