Share via


資料庫函式

資料庫函式是 C# 方法的資料庫 對等專案 。 您可以使用零個或多個參數叫用資料庫函式,並根據參數值計算結果。 大部分使用 SQL 進行查詢的資料庫都支援資料庫函式。 因此,EF Core 查詢翻譯所產生的 SQL 也允許叫用資料庫函式。 C# 方法不需要嚴格地轉譯為 EF Core 中的資料庫函式。

  • C# 方法可能沒有對等的資料庫函式。
  • 資料庫函式可能沒有對等的 C# 方法。 ??C# 中的 運算子,沒有任何方法,會轉譯為資料庫中的 COALESCE 函式。

資料庫函式的類型

EF Core SQL 產生支援可在資料庫中使用的函式子集。 這項限制來自在 LINQ 中代表指定資料庫函式之查詢的能力。 此外,每個資料庫都有不同的資料庫函式支援,因此 EF Core 提供一般子集。 資料庫提供者可以免費擴充 EF Core SQL 產生,以支援更多模式。 以下是 EF Core 支援和唯一識別的資料庫函式類型。 這些詞彙也有助於瞭解 EF Core 提供者內建的翻譯。

內建與使用者定義函式

內建函式隨附預先定義的資料庫,但使用者定義的函式是由資料庫中的使用者明確定義。 當 EF Core 轉譯查詢以使用資料庫函式時,它會使用內建函式,以確保該函式一律可在資料庫上使用。 某些資料庫中必須要有內建函式的區別,才能正確產生 SQL。 例如,SqlServer 要求使用架構限定名稱叫用每個使用者定義函式。 但是 SqlServer 中的內建函式沒有架構。 PostgreSQL 會在架構中 public 定義內建函式,但可以使用架構限定名稱來叫用。

匯總與純量與資料表值函式

  • 純量函式會採用純量值 -- 例如整數或字串 - 作為參數,並傳回純量值作為結果。 純量函式可以在 SQL 中傳遞純量值的任何位置使用。
  • 彙總函式會採用純量值的資料流程做為參數,並傳回純量值作為結果。 彙總函式會套用至整個查詢結果集,或套用運算子所產生的 GROUP BY 值群組上。
  • 資料表值函式會採用純量值作為參數,並傳回資料列資料流程作為結果。 資料表值函式會當做 子句中的 FROM 資料表來源使用。

Niladic 函式

Niladic 函式是沒有任何參數的特殊資料庫函式,而且必須在沒有括弧的情況下叫用。 它們類似于 C# 實例上的屬性/欄位存取。 Niladic 函式與無參數函式不同,因為後者需要空括弧。 不需要括弧的資料庫函式沒有特殊名稱。 另一個以參數計數為基礎的資料庫函式子集是 variadic 函式。 叫用時,Variadic 函式可以接受不同數目的參數。

EF Core 中的資料庫函式對應

EF Core 支援 C# 函式與資料庫函式之間的三種不同的對應方式。

內建函式對應

根據預設,EF Core 提供者會針對基本類型的各種內建函式提供對應。 例如, String.ToLower() 在 SqlServer 中轉譯為 LOWER 。 此功能可讓使用者順暢地在 LINQ 中撰寫查詢。 我們通常會在資料庫中提供轉譯,以提供與用戶端 C# 函式所提供的相同結果。 有時候,若要達成此目的,實際的翻譯可能比資料庫函式複雜一些。 在某些情況下,我們也提供最適當的翻譯,而不是比對 C# 語意。 相同的功能也可用來提供一些 C# 成員存取的一般翻譯。 例如, String.Length 在 SqlServer 中轉譯為 LEN 。 除了提供者之外,外掛程式寫入器也可以新增其他翻譯。 當外掛程式將更多類型的支援新增為基本類型,並想要透過這些類型轉譯方法時,此擴充性很有用。

英 孚。函式對應

因為並非所有資料庫函式都有相等的 C# 函式,EF Core 提供者有特殊的 C# 方法來叫用特定資料庫函式。 這些方法會定義為延伸 EF.Functions 方法,以用於 LINQ 查詢。 這些方法是提供者特定的,因為它們與特定資料庫函式緊密系結。 因此,適用于某個提供者的方法可能不適用於任何其他提供者。 此外,由於這些方法的意圖是在翻譯的查詢中叫用資料庫函式,因此嘗試在用戶端上評估它們會產生例外狀況。

使用者定義函數對應

除了 EF Core 提供者所提供的對應之外,使用者也可以定義自訂對應。 使用者定義的對應會根據使用者需求擴充查詢翻譯。 當使用者想要從其 LINQ 查詢叫用的使用者定義函式時,此功能非常有用。

另請參閱