查詢的運作方式
Entity Framework Core 使用 Language Integrated Query (LINQ) 查詢來自資料庫的資料。 LINQ 可讓您使用 C# (或您選擇的 .NET 語言),根據衍生內容和實體類別來寫入強型別查詢。
注意
本文已過期,部分部分必須更新,以考慮查詢管線設計中發生的變更。 如果您對這裡提及的任何行為有任何疑慮,請 提出問題 。
查詢的生命週期
下列描述是每個查詢所經歷之程式的高階概觀。
- LINQ 查詢會由 Entity Framework Core 處理,以建置可供資料庫提供者處理的標記法
- 結果會被快取,因此並不需要在每次執行查詢時進行此處理程序
- 結果會傳遞至資料庫提供者
- 資料庫提供者會識別查詢的哪些組件可在資料庫中評估
- 這些查詢部分會轉譯為資料庫特定的查詢語言(例如關係資料庫的 SQL)
- 查詢會傳送至資料庫和傳回的結果集(結果是來自資料庫的值,而不是實體實例)
- 針對結果集中的每個專案
- 如果查詢是追蹤查詢,EF 會檢查資料是否代表已在內容實例變更追蹤器中的實體
- 如果是,就會傳回現有的實體
- 如果沒有,則會建立新的實體、設定變更追蹤,並傳回新的實體
- 如果查詢是無追蹤查詢,則一律會建立並傳回新的實體
- 如果查詢是追蹤查詢,EF 會檢查資料是否代表已在內容實例變更追蹤器中的實體
查詢執行時
當您呼叫 LINQ 運算子時,只需建置查詢的記憶體內部標記法。 只有在取用結果時,才會將查詢傳送到資料庫。
以下是導致將查詢傳送到資料庫的最常見作業:
- 在
for
迴圈中逐一查看結果 - 使用運算子,例如
ToList
、ToArray
、Single
、Count
或對等的非同步多載
警告
一律驗證使用者輸入:雖然 EF Core 使用參數以及在查詢中逸出常值來防止 SQL 插入式攻擊,但是它不會驗證輸入。 在 LINQ 查詢中使用值、指派給實體屬性或傳遞至其他 EF Core API 之前,應根據應用程式的需求執行適當的驗證。 這包括用來以動態方式建構查詢的任何使用者輸入。 即使在使用 LINQ 時,如果您接受使用者輸入來建置運算式,就必須確定只會建構預期的運算式。