[Entity Framework][LINQ] IQueryable擴充方法Include的使用時機

[Entity Framework] IQueryable擴充方法Include的使用時機

使用時機

 

當類別內導航屬性(Navigation Properties)確定會被使用到且頻繁時,可透過IQueryable擴充方法Include將導航屬性資料也一併取出並儲存於記憶體中,後續在使用時就不需要再透過DB,可直接從記憶體中取得;若否,由於導航屬性具有延遲載入(Lazy Load)特性,會在使用到該導航屬性的當下才到DB撈取需要資料。

 

 

實際演練

 

先簡單說明一下類別結構,使用者(User)類別中有一個導航屬性為角色(Role)清單,在此筆者想要把使用者們取出,查看其各別所擁有的角色。在非使用Include()預先將使用者角色取出狀況下,於迴圈中取出使用者角色當下就必需逐次連線到DB撈取資料,若數量一大將是災難的開始(ex.取出100個User的角色就要向DB撈100次)。以下範例可發現,撈取2使用者後需要查看其角色時,又須針對個別使用者去DB查詢角色資料共2次。

 

image_thumb13

 

這時若在撈取使用者資料時,利用IQueryable擴充方法Include()把角色資料一併取出,在這當下我們就已經擁有所有資料了;因此在迴圈中所操作的角色資料將從記憶體而來,處理速度當然會比上例快上許多。從下圖可以發現只用了一道SQL指定就完成我們的目的。

 

image_thumb16


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

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