Udostępnij za pośrednictwem


Funkcje bazy danych

Funkcje bazy danych są odpowiednikiem metod języka C#. Funkcję bazy danych można wywołać z zerowymi lub większą większa większa liczba parametrów i oblicza wynik na podstawie wartości parametrów. Większość baz danych, które używają języka SQL do wykonywania zapytań, ma obsługę funkcji bazy danych. Dlatego język SQL generowany przez tłumaczenie zapytań platformy EF Core umożliwia również wywoływanie funkcji bazy danych. Metody języka C# nie muszą tłumaczyć się ściśle na funkcje bazy danych w programie EF Core.

  • Metoda języka C# może nie mieć równoważnej funkcji bazy danych.
    • String.IsNullOrEmpty metoda przekłada się na sprawdzanie wartości null i porównanie z pustym ciągiem w bazie danych, a nie funkcją.
    • String.Equals(String, StringComparison) Metoda nie ma odpowiednika bazy danych, ponieważ porównanie ciągów nie może być reprezentowane ani łatwo naśladowane w bazie danych.
  • Funkcja bazy danych może nie mieć równoważnej metody języka C#. Operator ?? w języku C#, który nie ma żadnej metody, przekłada się na COALESCE funkcję w bazie danych.

Typy funkcji bazy danych

Generacja SQL platformy EF Core obsługuje podzestaw funkcji, które mogą być używane w bazach danych. To ograniczenie wynika z możliwości reprezentowania zapytania w linQ dla danej funkcji bazy danych. Ponadto każda baza danych ma różną obsługę funkcji bazy danych, dlatego platforma EF Core udostępnia wspólny podzestaw. Dostawca bazy danych jest bezpłatny, aby rozszerzyć generowanie bazy danych EF Core SQL w celu obsługi większej liczby wzorców. Poniżej przedstawiono typy funkcji bazy danych obsługiwane przez platformę EF Core i jednoznacznie identyfikowane. Te terminy pomagają również zrozumieć, jakie tłumaczenia są wbudowane u dostawców platformy EF Core.

Wbudowane funkcje i funkcje zdefiniowane przez użytkownika

Wbudowane funkcje są dostarczane ze wstępnie zdefiniowanymi bazami danych, ale funkcje zdefiniowane przez użytkownika są jawnie definiowane przez użytkownika w bazie danych. Gdy program EF Core tłumaczy zapytania w celu używania funkcji bazy danych, używa wbudowanych funkcji, aby upewnić się, że funkcja jest zawsze dostępna w bazie danych. Rozróżnienie wbudowanych funkcji jest niezbędne w niektórych bazach danych do poprawnego generowania bazy danych SQL. Na przykład sqlServer wymaga, aby każda funkcja zdefiniowana przez użytkownika została wywołana przy użyciu nazwy kwalifikowanej schematem. Jednak wbudowane funkcje w programie SqlServer nie mają schematu. Usługa PostgreSQL definiuje wbudowaną funkcję w schemacie public , ale może być wywoływana z nazwami kwalifikowanymi schematami.

Funkcje agregujące a skalarne a tabelowe

  • Funkcje skalarne przyjmują wartości skalarne — takie jak liczby całkowite lub ciągi — jako parametry i zwracają wartość skalarną w wyniku. Funkcje skalarne mogą być używane w dowolnym miejscu w języku SQL, gdzie można przekazać wartość skalarną.
  • Funkcje agregujące przyjmują strumień wartości skalarnych jako parametry i zwracają wartość skalarną w wyniku. Funkcje agregujące są stosowane w całym zestawie wyników zapytania lub w grupie wartości generowanych przez zastosowanie GROUP BY operatora.
  • Funkcje wartości tabeli przyjmują wartości skalarne jako parametry i zwracają strumień wierszy w wyniku. Funkcje wartości tabeli są używane jako źródło tabeli w FROM klauzuli .

Funkcje Niladic

Funkcje Niladic to specjalne funkcje bazy danych, które nie mają żadnych parametrów i muszą być wywoływane bez nawiasów. Są one podobne do dostępu do właściwości/pola w wystąpieniu w języku C#. Funkcje Niladic różnią się od funkcji bez parametrów, ponieważ te ostatnie wymagają pustego nawiasu. Nie ma specjalnej nazwy funkcji bazy danych, które zawsze wymagają nawiasów. Innym podzbiorem funkcji bazy danych na podstawie liczby parametrów są funkcje wariadyczne. Funkcje Wariadyczne mogą mieć różną liczbę parametrów podczas wywoływania.

Mapowania funkcji bazy danych w programie EF Core

Program EF Core obsługuje trzy różne sposoby mapowania między funkcjami języka C# i funkcjami bazy danych.

Wbudowane mapowanie funkcji

Domyślnie dostawcy platformy EF Core udostępniają mapowania dla różnych wbudowanych funkcji w typach pierwotnych. Na przykład String.ToLower() przekłada się na LOWER w programie SqlServer. Ta funkcja umożliwia użytkownikom bezproblemowe pisanie zapytań w linQ. Zwykle udostępniamy tłumaczenie w bazie danych, które daje taki sam wynik jak funkcja języka C# udostępniana po stronie klienta. Czasami, aby to osiągnąć, rzeczywiste tłumaczenie może być czymś bardziej skomplikowanym niż funkcja bazy danych. W niektórych scenariuszach udostępniamy również najbardziej odpowiednie tłumaczenie, a nie dopasowywanie semantyki języka C#. Ta sama funkcja jest również używana do zapewniania typowych tłumaczeń dla niektórych elementów członkowskich języka C#. Na przykład String.Length przekłada się na LEN w programie SqlServer. Oprócz dostawców autorzy wtyczek mogą również dodawać dodatkowe tłumaczenia. Ta rozszerzalność jest przydatna, gdy wtyczki dodają obsługę większej liczby typów jako typów pierwotnych i chcą przetłumaczyć na nie metody.

EF. Mapowanie funkcji

Ponieważ nie wszystkie funkcje bazy danych mają równoważne funkcje języka C#, dostawcy platformy EF Core mają specjalne metody języka C# do wywoływania niektórych funkcji bazy danych. Te metody są definiowane jako metody EF.Functions rozszerzenia, które mają być używane w zapytaniach LINQ. Te metody są specyficzne dla dostawcy, ponieważ są ściśle powiązane z określonymi funkcjami bazy danych. Dlatego metoda, która działa dla jednego dostawcy, prawdopodobnie nie będzie działać dla żadnego innego dostawcy. Ponadto, ponieważ celem tych metod jest wywołanie funkcji bazy danych w przetłumaczonym zapytaniu, próba ich oceny na kliencie powoduje wyjątek.

Mapowanie funkcji zdefiniowanych przez użytkownika

Oprócz mapowań udostępnianych przez dostawców platformy EF Core użytkownicy mogą również definiować mapowanie niestandardowe. Mapowanie zdefiniowane przez użytkownika rozszerza tłumaczenie zapytania zgodnie z potrzebami użytkownika. Ta funkcja jest przydatna, gdy w bazie danych znajdują się funkcje zdefiniowane przez użytkownika, które użytkownik chce wywołać z zapytania LINQ.

Zobacz też