IQueryable VS IEnumerable
阿新 • • 發佈:2018-11-09
一、簡介
IEnumerable和IQuerable都是.Net集合裡的的介面:IEnumerable(公開列舉器),該列舉器用於迭代只讀集合;IQueryable 介面則繼承了IEnumerable介面。我將在下文闡述它們實質性的差異。
二、拿程式碼說事
//一個簡單的例子-通過模糊查詢獲取品牌集合 public List<IGoodsBrand> SearchBrands(string key) { var query = _unitOfWork.Repository<IGoodsBrand>().Table; var step1 = query.Where(p => p.commodityBrandName.Contains(key.Trim())); var step2 = step1.ToList(); return step2; }
此處"query"變數不必深究,我這裡用的是工作單元模式。下面呼叫程式碼塊中的方法,監視"step1"和"step2"的取值變化。
PS:List<T>是實現了介面IEnumerable 的
當執行完下面程式碼的時候,發現並沒有拿到自己想要的list,而是拿到一段sql。
var step1 = query.Table.Where(p => p.commodityBrandName.Contains(key.Trim()));
在此過程中,用擴充套件方法Where()中的匿名方法構建了查詢表示式,用於DB Query,但此時還並沒有在資料庫伺服器上執行。
繼續跑下面的程式碼,呼叫完ToList()方法後,才得到想要的結果,如圖所示:
var step2 = step1.ToList();
呼叫ToList()的時候,實際上將之前構造好的查詢表示式在資料庫伺服器上執行,並且將結果拉到記憶體中。
三、結論
上述便是EF中的延遲載入特性,其核心總結如下:
(1)所有對於IQueryable的過濾,排序等操作,只有在資料真正用到的時候才會到資料庫中查詢。(延遲發生)
(2)所有對於IEnumerable的過濾,排序等操作,都是在記憶體中發生的。(立即執行)
換而言之,用IEnumerable處理記憶體中的集合,但IQueryable允許使用遠端資料來源,如資料庫或Web服務。
四、效能優化
。。。。。。(未完待續)