Databázové funkce
Databázové funkce jsou ekvivalentem databázových metod jazyka C#. Databázová funkce se dá vyvolat s nulovými nebo více parametry a vypočítá výsledek na základě hodnot parametrů. Většina databází, které používají SQL pro dotazování, podporuje databázové funkce. SQL vygenerovaný překladem dotazů EF Core umožňuje také vyvolání databázových funkcí. Metody jazyka C# nemusí překládat výhradně na databázové funkce v EF Core.
- Metoda jazyka C# nemusí mít ekvivalentní databázovou funkci.
- String.IsNullOrEmpty Metoda se překládá na kontrolu null a porovnání s prázdným řetězcem v databázi místo funkce.
- String.Equals(String, StringComparison) Metoda nemá ekvivalent databáze, protože porovnání řetězců nelze v databázi snadno reprezentovat ani mimickovat.
- Funkce databáze nemusí mít ekvivalentní metodu jazyka C#. Operátor
??
v jazyce C#, který nemá žádnou metoduCOALESCE
, se přeloží na funkci v databázi.
Typy databázových funkcí
Generování EF Core SQL podporuje podmnožinu funkcí, které je možné použít v databázích. Toto omezení vychází z možnosti reprezentovat dotaz v LINQ pro danou funkci databáze. Každá databáze má navíc různou podporu databázových funkcí, takže EF Core poskytuje společnou podmnožinu. Poskytovatel databáze je zdarma rozšířit generování SQL EF Core, aby podporoval více vzorů. Následují typy databázových funkcí, které EF Core podporuje a jednoznačně identifikuje. Tyto termíny také pomáhají pochopit, které překlady jsou integrované s poskytovateli EF Core.
Integrované a uživatelem definované funkce
Předdefinované funkce jsou součástí předdefinované databáze, ale uživatelem definované funkce jsou explicitně definované uživatelem v databázi. Když EF Core překládá dotazy na používání databázových funkcí, používá integrované funkce, aby se zajistilo, že je funkce vždy dostupná v databázi. V některých databázích je potřeba rozlišovat předdefinované funkce, aby se sql vygeneroval správně. Například SqlServer vyžaduje, aby se každá uživatelem definovaná funkce vyvolala s názvem kvalifikovaným schématem. Integrované funkce v SqlServeru ale nemají schéma. PostgreSQL definuje integrovanou funkci ve schématu public
, ale dají se vyvolat s názvy kvalifikovanými schématy.
Agregace vs. skalární a tabulkové funkce
- Skalární funkce přebírají skalární hodnoty , jako jsou celá čísla nebo řetězce, jako parametry a vrací skalární hodnotu jako výsledek. Skalární funkce je možné použít kdekoli v SQL, kde lze předat skalární hodnotu.
- Agregační funkce jako parametry přebírají datový proud skalárních hodnot a jako výsledek vrátí skalární hodnotu. Agregační funkce se použijí na celou sadu výsledků dotazu nebo na skupinu hodnot vygenerovaných použitím
GROUP BY
operátoru. - Funkce hodnot tabulky přebírají skalární hodnoty jako parametry a v důsledku toho vrací datový proud řádků. Funkce s hodnotami tabulky se používají jako zdroj tabulky v
FROM
klauzuli.
Niladické funkce
Niladické funkce jsou speciální databázové funkce, které nemají žádné parametry a musí být vyvolány bez závorek. Podobají se přístupu k vlastnostem a polím v instanci v jazyce C#. Niladické funkce se liší od funkcí bez parametrů, protože druhá funkce vyžadují prázdnou závorku. Pro databázové funkce neexistuje žádný zvláštní název, který vždy vyžaduje závorky. Další podmnožinou databázových funkcí založených na počtu parametrů je variadické funkce. Variadické funkce mohou při vyvolání přijímat různé parametry.
Mapování databázových funkcí v EF Core
EF Core podporuje tři různé způsoby mapování mezi funkcemi jazyka C# a databázovými funkcemi.
Integrované mapování funkcí
Ve výchozím nastavení poskytovatelé EF Core poskytují mapování pro různé předdefinované funkce nad primitivními typy. Například String.ToLower() se přeloží na LOWER
sqlServer. Tato funkce umožňuje uživatelům bez problémů psát dotazy v LINQ. Obvykle poskytujeme překlad v databázi, který poskytuje stejný výsledek jako funkce C# na straně klienta. Někdy může být skutečný překlad něco složitějšího než databázová funkce. V některých scénářích poskytujeme také nejvhodnější překlad místo odpovídající sémantiky jazyka C#. Stejná funkce se také používá k poskytování běžných překladů pro některé přístupy členů jazyka C#. Například String.Length se přeloží na LEN
sqlServer. Kromě poskytovatelů můžou moduly plug-in přidávat i další překlady. Tato rozšiřitelnost je užitečná, když moduly plug-in přidávají podporu pro více typů jako primitivní typy a chtějí přes ně překládat metody.
EF. Mapování funkcí
Vzhledem k tomu, že ne všechny databázové funkce mají ekvivalentní funkce jazyka C#, zprostředkovatelé EF Core mají speciální metody jazyka C#, které volají určité databázové funkce. Tyto metody jsou definovány jako rozšiřující metody EF.Functions
, které se mají použít v dotazech LINQ. Tyto metody jsou specifické pro poskytovatele, protože jsou úzce svázané s konkrétními databázovými funkcemi. Takže metoda, která funguje pro jednoho poskytovatele, pravděpodobně nebude fungovat pro žádného jiného poskytovatele. Vzhledem k tomu, že záměrem těchto metod je vyvolat v přeloženém dotazu funkci databáze, pokus o jejich vyhodnocení v klientovi způsobí výjimku.
Mapování uživatelem definované funkce
Kromě mapování poskytovaných poskytovateli EF Core můžou uživatelé také definovat vlastní mapování. Mapování definované uživatelem rozšiřuje překlad dotazů podle potřeb uživatele. Tato funkce je užitečná, když v databázi existují uživatelem definované funkce, které chce uživatel vyvolat ze svého dotazu LINQ.