IEnumerable和IQueryable的區別

2022-02-26 08:29:35 字數 2326 閱讀 4747

ienumerable在.net2.0中我們已經很熟悉了.你想要利用foreach迭代嗎?實現 ienumerable吧!你想直接做為資料來源繫結到控制項嗎?使用ienumerable吧!是的.只要是序列.它都實現了 ienumerable(.net1.0下的序列類除外).除了這些.linq的出現.還賦予了 ienumerable更強悍的功能.iqueryable繼承ienumerable.詳細看 ienumerable和iqueryable這兩個api的簽名.可以說非常相似.從某種意義上來說.它們是可以 互換的.但是卻不總是可以互相代替的.ienumerable和iqueryable的行為有所不同.其效能方面也 可能天差地別.例如:

var q = from c in dbcontext.customers

where c.city == "shenzhen"

select c;

var q = (from c in dbcontext.customers

where c.city == "shenzhen"

select c).asenumerable();

這兩個查詢看起來幾乎一模一樣.查詢返回的結果也一樣.但他們的實現方式卻大相徑庭.第乙個查詢使用了linq2sql的處理方式.第二個查詢則使 用了linq2object處理.通過前面的學習.我們知道,linq2object的處理結果是把linq表示式對映成對應的委託,而linq2sql 則是儲存了一系列的"步驟"---表示式樹的處理方式.兩者的區別簡單的理解就是linq2object將資料存放在記憶體中.而linq2sql則是把數 據存放在遠端的伺服器中.

舉乙個例子.現在有兩個水果批發商a,b..a除了是批發商,自己還承包了幾個果場.自產自銷.b和幾個大型的果場合作.只做批發工作.每次客人來a訂 貨.指定要什麼貨物,a就可以立刻拿出.速度快.服務佳.缺點是由於是自己的果場.那量肯定不大,而且品種不齊全,小作坊式的經營.b呢?每次客戶訂 單.b是先把客戶需要的貨物規格等記錄下來.一次性去各個果場取貨.這樣b的優點就是量大.品種多.但速度可能偏慢(收到貨的時間).不過若b以a的銷售 方式來銷售.那麼b的效績肯定是讓人十分不滿意,工廠式的經營.

總結之,ienumerable查詢必須在本地執行.並且執行查詢前我們必須把所有的資料載入到本地.而且更多的時候.載入的資料有大 量的資料是我們不需要的無效資料.但是我們卻不得不傳輸更多的資料.做更多的無用功.而iqueryable卻總能只提供你所需要的數 據.大大減少了資料的傳輸.這就好比我們在小作坊下訂單.小作坊老闆跟我們說.他的貨剛好比你所需要的多出一些.你只能要了它.不然剩下一點他不好賣等 等.而大工廠卻不會出現這種狀況.

雖說小作坊很多弊病.但有時候卻有著大工廠無法媲美的服務.假如你需要一種八種水果組合**.大工廠一般不會為你量身定做.單對單服務.相反.小作坊客源有限.一般都會滿足你的個人需求.

場景切換:在<<[more effective c#]lambda表示式優化》裡我們提到過.linq2sql中是不允許出現自定義方法的.這是由於linq2sql的處理方式.詳見<<[more effective c#]lambda表示式優化》.而linq2object卻能很好的滿足我們自定義方法這個性化的要求.

但是.除了自定義方法.還有一些內建的方法ienumerable和iqueryable是同時支援的.例如常見的string類的操作方法.substring,indexof等等.

iqueryable繼承自ienumerable,所以對於資料遍歷來說,它們沒有區別。

1.ienumerable查詢必須在本地執行.並且執行查詢前我們必須把所有的資料載入到本地.而且更多的時候.載入的資料有大量的資料是我們不需要的無效資料.但是我們卻不得不傳輸更多的資料.做更多的無用功。

使用ienumerable,所有對於ienumerable的過濾,排序等操作,都是在記憶體中發生的。也就是說資料已經從資料庫中獲取到了記憶體中,只是在記憶體中進行過濾和排序操作。

2.iqueryable卻總能只提供你所需要的數 據.大大減少了資料的傳輸

iqueryable的優勢是它有表示式樹,所有對於iqueryable的過濾,排序等操作,都會先快取到表示式樹中,只有當真正遍歷發生的時候,才會將表示式樹由iqueryprovider執行獲取資料操作。

可能這個例子在這裡有些牽強.但相信ienumerable和iqueryable之間的區別不難理解.更多時候我 們在查詢序列的時候.要考慮到底是本地查詢好.還是遠端查詢好.至於哪種查詢更好.沒有絕對的說法.適合應用環境,已經能發揮最大效應的.那就是最好的.

ienumerable是小作坊做法,因為它把資料載入到本地後才做過濾操作,

ienumerable資料已載入到記憶體

iqueryable是工廠模式,按需訂購.在實際場景中, 工作模式的場景還是比較多的. 

iqueryable此時為表示式,待tolist的時候載入到記憶體 

**:

IEnumerable和IQueryable之我觀

在弄明白ienumerable和這兩個東西之前,首先我們要清楚 linq 查詢操作中的型別關係 問題。引用msdn的文字 不轉換源資料的查詢 下圖演示不對資料執行轉換的 linq to objects 查詢操作。源包含乙個字串序列,查詢輸出也是乙個字串序列。資料來源的型別引數決定範圍變數的型別。選擇...

IEnumerable和IQueryable之我觀

在弄明白ienumerable和這兩個東西之前,首先我們要清楚 linq 查詢操作中的型別關係 問題。引用msdn的文字 不轉換源資料的查詢 下圖演示不對資料執行轉換的 linq to objects 查詢操作。源包含乙個字串序列,查詢輸出也是乙個字串序列。資料來源的型別引數決定範圍變數的型別。選擇...

IEnumerable和IQueryable的區別

ienumerable介面 公開列舉器,該列舉器支援在指定型別的集合上進行簡單迭代。也就是說 實現了此介面的object,就可以直接使用foreach遍歷此object iqueryable 介面 它繼承 ienumerable 介面,而因為.net版本加入linq和 iqueryable後,使得i...