Sdílet prostřednictvím


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.
  • Funkce databáze nemusí mít ekvivalentní metodu jazyka C#. Operátor ?? v jazyce C#, který nemá žádnou metodu COALESCE , 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.

Viz také