1. 程式人生 > >IQueryable VS IEnumerable

IQueryable VS IEnumerable

一、簡介

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服務。

四、效能優化

 。。。。。。(未完待續)