# WebApi 配關聯式資料,讀取超慢的問題 ###### tags: `被玩壞了` ## 情境說明 此案例中使用北風資料庫,在撈員工資料的時候,會撈到員工所成交的訂單資料(和細節),訂單資料中又會有顧客資料...。導致只是撈一個員工資料,就撈到一大堆跟他有關的資料...(我只是想要員工資料rrrrrr) ## 消極式讀取 消極式讀取的話會在你需要使用的時候才會撈取資料 Ex. 我已撈的員工資料 => employee.Orders。開始使用 Orders 才會撈取資料,當然是連線未關閉的時候使用才會去撈,若連線關閉時使用,會導致 Exception。如下範例: ``` // 使用 using 在這其中有 DB 連線沒錯,但程式看到 return 後就直接跳出 using 了 using (var _db = new NorthwindContext()) { return _db.Employees.FirstOrDefault(x => x.EmployeeID == id); } ``` ![](https://i.imgur.com/IK1c9Jy.png) ### 設置方法 & 設置時機 1. 在 edmx 的頁面配置 ![](https://i.imgur.com/4ZUO0KN.png) 2. 在建立 Context 的時候配置 ![](https://i.imgur.com/UT68rJZ.png) ### 設置消極式讀取之後,如果想讀特定資料怎麼辦? 使用 Include Function ``` _Context.Employees.Include(x=>x.Orders).ToList(); ``` --- ## 為什麼設定消極式讀取還是一樣慢,而且資料都有被讀取?! 因為 **Web Api 配置回傳 Json,所以 Web Api 的方法 return 的時候,Json 去遍歷所有欄位**,遍歷的行為導致 EF 覺得你要用這個欄位,幫你撈了資料 ( [先看上方了解消極式讀取](https://hackmd.io/3giEV4NLQ8KHuo5S5o3dag#%E6%B6%88%E6%A5%B5%E5%BC%8F%E8%AE%80%E5%8F%96) ) 解法: 1. 將不想讀到的資料加上 [JsonIgone] 屬性 缺點: 真的 include orders 的時候一樣會沒資料 ( 可能要改寫 JsonIgone,用一個介面 for API 用,如果資料為空或 null 才 Igone (?) ) 2. 建立一個一樣的 Employee Class,只回傳這個 Class,這樣 return 時,因為這 Class 不是 EF 的 Class,就不會因為遍歷的行為跑去撈 DB