Adatbázis függvények

Az adatbázisfüggvények a C# metódusok adatbázis-megfelelői. Egy adatbázisfüggvény meghívható nulla vagy több paraméterrel, és a paraméterértékek alapján számítja ki az eredményt. A lekérdezéshez SQL-t használó adatbázisok többsége támogatja az adatbázisfüggvényeket. Az EF Core-lekérdezésfordítás által generált SQL tehát lehetővé teszi az adatbázisfüggvények meghívását is. A C#-metódusoknak nem kell szigorúan az EF Core adatbázisfüggvényeire fordítaniuk.

  • Előfordulhat, hogy a C# metódus nem rendelkezik egyenértékű adatbázisfüggvényrel.
    • A String.IsNullOrEmpty metódus inkább nullával való ellenőrzéssé és az adatbázis üres sztringjével való összehasonlítássá alakul, nem pedig egy függvénnyé.
    • String.Equals(String, StringComparison) a metódus nem rendelkezik adatbázis-megfelelővel, mivel a sztringek összehasonlítását nem lehet egyszerűen ábrázolni vagy utánozni egy adatbázisban.
  • Előfordulhat, hogy az adatbázisfüggvények nem rendelkeznek egyenértékű C# metódussal. A ?? C# operátora, amely nem rendelkezik metódussal, az COALESCE adatbázis függvényére fordít.

Az adatbázis függvények típusai

Az EF Core SQL-generáció támogatja az adatbázisokban használható függvények egy részét. Ennek a korlátozásnak az az oka, hogy egy lekérdezést a LINQ-ban kell kifejezni az adott adatbázisfüggvény segítségével. Emellett minden adatbázis különböző mértékben támogatja az adatbázisfüggvényeket, így az EF Core egy közös részhalmazt biztosít. Az adatbázis-szolgáltató szabadon bővítheti az EF Core SQL-generációt a további minták támogatásához. Az alábbi adatbázisfüggvények típusait támogatja az EF Core, és egyedileg azonosítja azokat. Ezek a kifejezések segítenek megérteni, hogy milyen fordítások jönnek létre az EF Core-szolgáltatókkal.

Beépített és felhasználó által definiált függvények

A beépített függvényeket az adatbázis előre definiált módon tartalmazza, míg a felhasználó által definiált függvényeket a felhasználó explicit módon hozza létre az adatbázisban. Amikor az EF Core lefordítja a lekérdezéseket adatbázisfüggvények használatára, beépített függvényeket használ annak biztosítása érdekében, hogy a függvény mindig elérhető legyen az adatbázisban. Egyes adatbázisokban a beépített függvények megkülönböztetése szükséges az SQL helyes létrehozásához. Az SqlServer például megköveteli, hogy a rendszer minden felhasználó által definiált függvényt séma-minősített névvel hívjon meg. Az SqlServer beépített függvényei azonban nem rendelkeznek sémával. A PostgreSQL a public sémában definiálja a beépített függvényeket, de ezek séma-minősített nevekkel hívhatók meg.

Összesítés és skaláris és táblaértékelt függvények

  • A skaláris függvények paraméterként skaláris értékeket – például egész számokat vagy sztringeket – vesznek fel, és eredményként skaláris értéket ad vissza. A skaláris függvények bárhol használhatók az SQL-ben, ahol skaláris érték adható át.
  • Az aggregátumfüggvények paraméterként a skaláris értékek adatfolyamát veszik figyelembe, és eredményként skaláris értéket ad vissza. Az összesítő függvények a teljes lekérdezési eredményhalmazra vagy az operátor által létrehozott értékek egy csoportjára lesznek alkalmazva GROUP BY .
  • A táblaértékelt függvények paraméter(ek)ként veszik fel a skaláris értékeket, és ennek eredményeként sorfolyamot ad vissza. A táblaértékelt függvények táblaforrásként használatosak a záradékban FROM .

Niladikus függvények

A niladikus függvények olyan speciális adatbázisfüggvények, amelyek nem rendelkeznek paraméterekkel, és zárójel nélkül kell meghívni. Hasonlítanak egy C#-példány tulajdonság-/mezőhozzáféréséhez. A niladikus függvények eltérnek a paraméter nélküli függvényektől, mivel az utóbbi üres zárójelet igényel. Nincs olyan speciális név az adatbázisfüggvényekhez, amelyek mindig zárójelet igényelnek. Az adatbázisfüggvények paraméterszámon alapuló egy másik részhalmaza a variadikus függvények. A variadikus függvények meghívása különböző számú paramétert vehet igénybe.

Adatbázisfüggvény-leképezések az EF Core-ban

Az EF Core három különböző leképezési módot támogat a C# függvények és az adatbázisfüggvények között.

Beépített függvényleképezés

Alapértelmezés szerint az EF Core-szolgáltatók különböző beépített függvényekhez biztosítanak leképezéseket primitív típusok esetében. Például String.ToLower() az SqlServerben fordítja LOWER le. Ezzel a funkcióval a felhasználók zökkenőmentesen írhatnak lekérdezéseket a LINQ-ban. Általában olyan fordítást biztosítunk az adatbázisban, amely ugyanazt az eredményt adja, mint amit a C# függvény biztosít az ügyféloldalon. Néha ennek eléréséhez a tényleges fordítás bonyolultabb lehet, mint egy adatbázisfüggvény. Bizonyos esetekben a C# szemantikája helyett a legmegfelelőbb fordítást is biztosítjuk. Ugyanez a funkció a C#-tagok egyes hozzáféréseinek gyakori fordítására is használható. Például String.Length az SqlServerben fordítja LEN le. A szolgáltatókon kívül a beépülő modulírók további fordításokat is hozzáadhatnak. Ez a bővíthetőség akkor hasznos, ha a beépülő modulok több típust támogatnak primitív típusokként, és metódusokat szeretnének lefordítani rajtuk.

EF. Függvények leképezése

Mivel nem minden adatbázisfüggvény rendelkezik egyenértékű C# függvényekkel, az EF Core-szolgáltatók speciális C# metódusokkal rendelkeznek bizonyos adatbázisfüggvények meghívására. Ezek a metódusok kiterjesztési metódusokként vannak definiálva, hogy a LINQ-lekérdezésekben használhatóak legyenek. Ezek a metódusok szolgáltatóspecifikusak, mivel szorosan kötődnek bizonyos adatbázisfüggvényekhez. Így egy olyan módszer, amely egy szolgáltatónál működik, valószínűleg nem fog működni más szolgáltatónál. Mivel ezen metódusok célja egy adatbázisfüggvény meghívása a lefordított lekérdezésben, az ügyfélen való kiértékelésük kivételt eredményez.

Felhasználó által definiált függvényleképezés

Az EF Core-szolgáltatók által biztosított leképezéseken kívül a felhasználók egyéni leképezéseket is meghatározhatnak. A felhasználó által definiált leképezések a felhasználói igényeknek megfelelően kibővítik a lekérdezésfordítást. Ez a funkció akkor hasznos, ha az adatbázisban vannak felhasználó által definiált függvények, amelyeket a felhasználó a LINQ-lekérdezésből szeretne meghívni.

Lásd még