---
# System prepended metadata

title: WebApi 配關聯式資料，讀取超慢的問題
tags: [被玩壞了]

---

# 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