2017年2月25日 星期六

[Entity Framework]IQueryable v.s. IEnumerable

由於先前遇到Entity Framework會有Cache的狀況,而注意到IQueryable以及IEnumerable。
大部分操作LINQ皆預設採用IQueryable的形式進行,以獲得對於資料庫調教後的查詢效能。

基本上兩者的差異如下:
IEnumberable為將整份完整資料載入應用程式記憶體中進行操作。
IQueryable則為類似組SQL字串的模式,將操作轉換為對應SQL字串,直到實際取得資料時才從資料庫中取回資料。(可以把他想成它就是在做LINQ語法與查詢字串之間的轉換)

以下是個簡單實驗,透過超強的LINQPad來看看兩者差異。
從範例畫面可以看到三種方法的資料結果皆相同。

但切換至SQL語法可以發現,case 1將User中所有的資料取回至記憶體中才進行資料篩選。
而case 2以及case 3皆利用SQL語句在資料庫中便進行資料篩選的查詢。

故若資料庫有針對資料表進行調教(例如建立查詢Index等),使用IQueryable才能真正享受到這樣的好處。

而從範例中也可以發現Where回傳的仍為IQueryable,應證了一開始提到的大部分操作LINQ皆預設採用IQueryable的形式進行的論點。

參考資料:
[Entity Framework][LINQ] IEnumerable與IQueryable差異比較
https://dotblogs.com.tw/wasichris/2015/03/04/150633

沒有留言:

張貼留言