[Entity Framework][LINQ] IEnumerable與IQueryable差異比較

IEnumerable與IQueryable差異比較

前言

在Linq使用上我們常常會用到IEnumerable與IQueryable兩大介面。我們都知道IEnumerable 是可列舉的所有非泛型集合的基底介面,讓實作此介面物件具有被巡訪的能力,而我們常用的List就是繼承實作此介面; 至於IQueryable是提供查詢Provider實作之用,由於此介面繼承自IEnumerable介面,亦表示查詢結果是可被列舉巡訪的。此篇文章將就筆者在使用上的差異性來進行比較。

 

資料篩選方式

IEnumerable:

取出當前符合條件的所有資料後,在記憶體中進行後續資料篩選

IQueryable:

會保存所有條件限制於Query Expression中,直到資料真正被列舉成具體資料的當下才將最終的Query Expression透過Query Provider轉換為實際執行的SQL語法,從DB取出符合條件資料。

 

以下使用AsEnumerable及AsQueryable方式撈出特定使用者帳號資料,從結果面來看是相同的。

image

從實際使用的SQL語法可以發現資料獲取方式是截然不同的。

image

由以上測試可知,IEnumerable資料是先將User Table中所有資料(當下未設任何條件)撈出於記憶體中,然後在記憶體中針對後續條件進行篩選;反之,IQueryable資料在還沒列舉成具體資料(ToList)前,會保存所有條件限制於Query Expression中,等到資料被轉換或執行當下才將Query Expression轉換為SQL語法,故可精準地向DB撈取符合條件資料。當User Table中資料量很大時,就會很明顯的感受到兩者差異,所以這部份是要特別注意的。

 

適用時機

  • IEnumerable: 處理記憶體內的資料 ex. List / Array
  • IQueryable: 處理遠端來源的資料 ex. Database / Service

希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !