一、IEnumerable接口
公開枚舉器,該枚舉器支援在指定類型的集合上進行簡單疊代。也就是說:實作了此接口的object,就可以直接使用foreach周遊此object
二、IQueryable 接口
它繼承 IEnumerable 接口,而因為.net版本加入Linq和IQueryable後,使得IEnumerable不再那麼單調,變得更加強大和豐富。
三、IQueryable與IEnumberable的差別
1、IEnumerable<T> 泛型類在調用自己的SKip 和 Take 等擴充方法之前資料就已經加載在本地記憶體裡了
2、IQueryable<T> 是将Skip ,take 這些方法表達式翻譯成T-SQL語句之後再向SQL伺服器發送指令,它并不是把所有資料都加載到記憶體裡來才進行條件過濾。
四、IQueryable與IEnumberable的執行個體說明一
1、IEnumerable執行個體
var set3 = (from c in db.cms_certificateDetails select c).OrderByDescending(c => c.id).AsEnumerable()
.Skip(150).Take(10);
foreach (var cmsCertificateDetailse in set3)
{
Console.WriteLine(cmsCertificateDetailse.czry + ";" + cmsCertificateDetailse.kddh + "\\r\\n");//列印結果
}
生成的SQL 語句
SELECT
[Extent1].[id] AS [id],
[Extent1].[kddh] AS [kddh],
[Extent1].[czry] AS [czry],
[Extent1].[yjnr] AS [yjnr],
[Extent1].[tjTime] AS [tjTime],
[Extent1].[bz] AS [bz],
[Extent1].[forId] AS [forId]
FROM [dbo].[cms_certificateDetails] AS [Extent1]
ORDER BY [Extent1].[id] DESC
2、IQueryable執行個體
var set4 = (from c in db.cms_certificateDetails select c).OrderByDescending(c => c.id).AsQueryable()
.Skip(150).Take(10);
foreach (var cmsCertificateDetailse in set4)
{
Console.WriteLine(cmsCertificateDetailse.czry + ";" + cmsCertificateDetailse.kddh + "\\r\\n");//列印結果
}
生成的SQL語句
SELECT TOP (10)
[Extent1].[id] AS [id],
[Extent1].[kddh] AS [kddh],
[Extent1].[czry] AS [czry],
[Extent1].[yjnr] AS [yjnr],
[Extent1].[tjTime] AS [tjTime],
[Extent1].[bz] AS [bz],
[Extent1].[forId] AS [forId]
FROM ( SELECT [Extent1].[id] AS [id], [Extent1].[kddh] AS [kddh], [Extent1].[czry] AS [czry], [Extent1].[yjnr] AS [yjnr], [Extent1].[tjTime] AS [tjTime], [Extent1].[bz] AS [bz], [Extent1].[forId] AS [forId], row_number() OVER (ORDER BY [Extent1].[id] DESC) AS [row_number]
FROM [dbo].[cms_certificateDetails] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 150
ORDER BY [Extent1].[id] DESC
文章轉載自: IQueryable與IEnumberable的差別 http://www.studyofnet.com/news/730.html