在新的系統框架中,常會用到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 不會立即在記憶體裡建立持久資料,只有遍歷...