資料庫函式
資料庫函式相當於資料庫的 C# 方法。 您可以使用零個或多個參數叫用資料庫函式,它會根據參數值計算結果。 多數使用 SQL 進行查詢的資料庫都支援資料庫函式。 因此,EF Core 查詢轉譯所產生的 SQL 也允許叫用資料庫函式。 C# 方法不需要嚴格轉譯為 EF Core 的資料庫函式。
- C# 方法可能沒有對等資料庫函式。
- String.IsNullOrEmpty 方法會轉譯為 Null 檢查,以及比較資料庫 (而不是字串) 的空白字串。
- String.Equals(String, StringComparison) 方法在資料庫中沒有對等的方法,因為資料庫無法簡單表示或模擬字串比較。
- 資料庫函式可能沒有對等的 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
。 除了提供者之外,外掛程式寫入器也可新增額外的轉譯。 如果外掛程式將更多類型視為基本類型新增支援,並想要對這些類型轉譯方法,這種擴充功能就很實用。
EF.Functions 對應
由於並非所有資料庫函式都有對等的 C# 函式,EF Core 提供者設有特殊的 C# 方法來叫用特定資料庫函式。 這些方法定義在要用於 LINQ 查詢的 EF.Functions
中,定義為擴充函式。 這些方法與特定資料庫函式緊密連結,因此是提供者專用。 因此,某個提供者適用的方法,可能不適用於任何其他提供者。 此外,由於這些方法的意圖是在轉譯的查詢中叫用資料庫函式,因此嘗試在用戶端評估這些方法會產生例外狀況。
使用者定義函數對應
除了 EF Core 提供者所提供的對應之外,使用者也可以定義自訂對應。 使用者定義的對應會根據使用者需求擴充查詢轉譯。 使用者想要從 LINQ 查詢叫用資料庫的使用者定義函式時,此功能非常有用。