IQueryable和IEnumerable的區別

2021-07-03 09:13:36 字數 1977 閱讀 3371

在新的系統框架中,常會用到iqueryable和ienumerable這兩個介面,經過一段時間的接觸和學習,對於這兩種型別的區別有了初步的理解。我們先來看一下這兩種介面的定義:

ienumerable介面

公開列舉器,該列舉器支援在指定型別的集合上進行簡單迭代。也就是說:實現了此介面的object,就可以直接使用foreach遍歷此object;

iqueryable 介面

它繼承 ienumerable 介面,而因為.net版本加入linq和iqueryable後,使得ienumerable不再那麼單調,變得更加強大和豐富。

為了區別兩個介面,我們通過乙個實際的例子來解釋一下。

[testmethod]

public void linqtest()

foreach (var c in enumers)

}

跟蹤一下**,看一下這兩段在執行時所生成的sql**:

第一段,返回iqueryable介面型別:

select

[extent1].[id] as [id],

[extent1].[code] as [code],

[extent1].[name] as [name],

[extent1].[status] as [status],

[extent1].[isonline] as [isonline],

[extent1].[systemversion] as [systemversion],

[extent1].[createdby] as [createdby],

[extent1].[createdon] as [createdon],

[extent1].[modifiedby] as [modifiedby],

[extent1].[modifiedon] as [modifiedon],

[extent1].[versionnumber] as [versionnumber]

from [dbo].[user] as [extent1]

order by [extent1].[code] asc

offset 2 rows fetch next 2 rows only

第二段,返回ienumerable介面型別:

select

[extent1].[id] as [id],

[extent1].[code] as [code],

[extent1].[name] as [name],

[extent1].[status] as [status],

[extent1].[isonline] as [isonline],

[extent1].[systemversion] as [systemversion],

[extent1].[createdby] as [createdby],

[extent1].[createdon] as [createdon],

[extent1].[modifiedby] as [modifiedby],

[extent1].[modifiedon] as [modifiedon],

[extent1].[versionnumber] as [versionnumber]

from [dbo].[user] as [extent1]

order by [extent1].[code] asc

通過上面兩個例子我總結了一下,iqueryable介面與ienumberable介面的區別:

ienumerable泛型類在呼叫自己的skip 和 take 等擴充套件方法之前資料就已經載入在本地記憶體裡了,而iqueryable是將skip ,take 這些方法表示式翻譯成t-sql語句之後再向sql伺服器傳送命令,它並不是把所有資料都載入到記憶體裡來才進行條件過濾。

IQueryable和IEnumerable的區別

在新的系統框架中,常會用到iqueryable和ienumerable這兩個介面,經過一段時間的接觸和學習,對於這兩種型別的區別有了初步的理解。我們先來看一下這兩種介面的定義 ienumerable介面 公開列舉器,該列舉器支援在指定型別的集合上進行簡單迭代。也就是說 實現了此介面的object,就...

IQueryable和IEnumerable的區別

iqueryable介面是繼承自ienumerable的介面 iqueryable中有表示式樹,這可以看作是它的乙個優勢。所以,使用iqueryable操作時,比如對資料的過濾,排序等操作,這些都會先快取到表示式樹中。當對資料庫操作真正發生時,它才會將表示式樹執行來獲取資料。這也就是說,比如選擇to...

IQueryable與IList差別之處

ilist ilist 會立即在記憶體裡建立持久資料,這就沒有實現 延期執行 deferred execution 如果被載入的實體有關聯實體 associations 此關聯實體不會被載入 既不立即載入,也不延遲載入 iqeurable iquerable 不會立即在記憶體裡建立持久資料,只有遍歷...