查詢的運作方式

Entity Framework Core 使用 Language Integrated Query (LINQ) 查詢來自資料庫的資料。 LINQ 可讓您使用 C# (或您選擇的 .NET 語言),根據衍生內容和實體類別來寫入強型別查詢。

注意

本文已過期,部分部分必須更新,以考慮查詢管線設計中發生的變更。 如果您對這裡提及的任何行為有任何疑慮,請 提出問題

查詢的生命週期

下列描述是每個查詢所經歷之程式的高階概觀。

  1. LINQ 查詢會由 Entity Framework Core 處理,以建置可供資料庫提供者處理的標記法
    1. 結果會被快取,因此並不需要在每次執行查詢時進行此處理程序
  2. 結果會傳遞至資料庫提供者
    1. 資料庫提供者會識別查詢的哪些組件可在資料庫中評估
    2. 這些查詢部分會轉譯為資料庫特定的查詢語言(例如關係資料庫的 SQL)
    3. 查詢會傳送至資料庫和傳回的結果集(結果是來自資料庫的值,而不是實體實例)
  3. 針對結果集中的每個專案
    1. 如果查詢是追蹤查詢,EF 會檢查資料是否代表已在內容實例變更追蹤器中的實體
      • 如果是,就會傳回現有的實體
      • 如果沒有,則會建立新的實體、設定變更追蹤,並傳回新的實體
    2. 如果查詢是無追蹤查詢,則一律會建立並傳回新的實體

查詢執行時

當您呼叫 LINQ 運算子時,只需建置查詢的記憶體內部標記法。 只有在取用結果時,才會將查詢傳送到資料庫。

以下是導致將查詢傳送到資料庫的最常見作業:

  • for 迴圈中逐一查看結果
  • 使用運算子,例如 ToListToArraySingleCount 或對等的非同步多載

警告

一律驗證使用者輸入:雖然 EF Core 使用參數以及在查詢中逸出常值來防止 SQL 插入式攻擊,但是它不會驗證輸入。 在 LINQ 查詢中使用值、指派給實體屬性或傳遞至其他 EF Core API 之前,應根據應用程式的需求執行適當的驗證。 這包括用來以動態方式建構查詢的任何使用者輸入。 即使在使用 LINQ 時,如果您接受使用者輸入來建置運算式,就必須確定只會建構預期的運算式。