Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Databasefuncties zijn het database-equivalent van C#-methoden. Een databasefunctie kan worden aangeroepen met nul of meer parameters en berekent het resultaat op basis van de parameterwaarden. De meeste databases, die SQL gebruiken voor het uitvoeren van query's, bieden ondersteuning voor databasefuncties. Sql die wordt gegenereerd door EF Core-queryomzetting, maakt het aanroepen van databasefuncties ook mogelijk. C#-methoden hoeven niet strikt te vertalen naar databasefuncties in EF Core.
- Een C#-methode heeft mogelijk geen equivalente databasefunctie.
- String.IsNullOrEmpty de methode wordt omgezet in een null-controle en een vergelijking met een lege tekenreeks in de database in plaats van een functie.
- String.Equals(String, StringComparison) de methode heeft geen database-equivalent, omdat tekenreeksvergelijking niet eenvoudig kan worden weergegeven of nagebootst in een database.
- Een databasefunctie heeft mogelijk geen equivalente C#-methode. De
??operator in C#, die geen methode heeft, wordt omgezet in deCOALESCEfunctie in de database.
Soorten databasefuncties
EF Core SQL-generatie ondersteunt een subset van functies die kunnen worden gebruikt in databases. Deze beperking komt van de mogelijkheid om een query in LINQ voor de opgegeven databasefunctie weer te geven. Bovendien heeft elke database verschillende ondersteuning voor databasefuncties, dus EF Core biedt een gemeenschappelijke subset. Een databaseprovider is vrij om de EF Core SQL-generatie uit te breiden om meer patronen te ondersteunen. Hieronder vindt u de typen databasefuncties die EF Core ondersteunt en uniek identificeert. Deze termen helpen ook bij het begrijpen van de vertalingen die zijn ingebouwd met EF Core-providers.
Ingebouwde versus door de gebruiker gedefinieerde functies
Ingebouwde functies worden geleverd met vooraf gedefinieerde database, maar door de gebruiker gedefinieerde functies worden expliciet gedefinieerd door de gebruiker in de database. Wanneer EF Core query's vertaalt om databasefuncties te gebruiken, worden ingebouwde functies gebruikt om ervoor te zorgen dat de functie altijd beschikbaar is in de database. Het onderscheid tussen ingebouwde functies is noodzakelijk in sommige databases om SQL correct te genereren. SqlServer vereist bijvoorbeeld dat elke door de gebruiker gedefinieerde functie wordt aangeroepen met een schema-gekwalificeerde naam. Maar ingebouwde functies in SqlServer hebben geen schema. PostgreSQL definieert ingebouwde functie in het public schema, maar ze kunnen worden aangeroepen met schema-gekwalificeerde namen.
Aggregaat versus scalaire versus tabelgewaarde functies
- Scalaire functies nemen scalaire waarden, zoals gehele getallen of tekenreeksen, als parameters op en retourneren een scalaire waarde als resultaat. Scalaire functies kunnen overal in SQL worden gebruikt waar een scalaire waarde kan worden doorgegeven.
- Aggregatiefuncties nemen een stroom scalaire waarden als parameters en retourneren een scalaire waarde als resultaat. Statistische functies worden toegepast op de hele queryresultatenset of op een groep waarden die worden gegenereerd door de operator toe te passen
GROUP BY. - Tabelwaardefuncties nemen scalaire waarden als parameter(en) en retourneren een stroom rijen als resultaat. Tabelwaardefuncties worden gebruikt als tabelbron in
FROMclausule.
Niladic-functies
Niladic-functies zijn speciale databasefuncties die geen parameters hebben en zonder haakjes moeten worden aangeroepen. Ze zijn vergelijkbaar met eigenschaps-/veldtoegang op een exemplaar in C#. Niladic-functies verschillen van parameterloze functies omdat voor de laatste functies lege haakjes nodig zijn. Er is geen speciale naam voor databasefuncties die altijd haakjes vereisen. Een andere subset van databasefuncties op basis van het aantal parameters is variadice functies. Variadic-functies kunnen verschillende parameters aannemen wanneer ze worden aangeroepen.
Database functie-toewijzingen in EF Core
EF Core ondersteunt drie verschillende manieren om te koppelen tussen C#-functies en databasefuncties.
Ingebouwde functie-afbeelding
Bij standaardinstelling bieden EF Core-providers toewijzingen voor verschillende ingebouwde functies voor primitieve typen. Vertaalt bijvoorbeeld String.ToLower() naar LOWER in SqlServer. Met deze functionaliteit kunnen gebruikers naadloos query's schrijven in LINQ. Meestal bieden we een vertaling in de database die hetzelfde resultaat geeft als wat de C#-functie aan de clientzijde biedt. Om dat te bereiken, kan de werkelijke vertaling iets ingewikkelder zijn dan een databasefunctie. In sommige scenario's bieden we ook de meest geschikte vertaling in plaats van overeenkomende C#-semantiek. Ditzelfde kenmerk wordt ook gebruikt om gemeenschappelijke vertalingen te bieden voor sommige C#-lidtoegangen. Vertaalt bijvoorbeeld String.Length naar LEN in SqlServer. Naast providers kunnen schrijvers van invoegtoepassingen ook extra vertalingen toevoegen. Deze uitbreidbaarheid is handig wanneer plug-ins ondersteuning voor meer typen toevoegen, zoals primitieve typen, en wanneer ze methoden over deze typen willen vertalen.
EF. Functietoewijzing
Omdat niet alle databasefuncties equivalente C#-functies hebben, hebben EF Core-providers speciale C#-methoden om bepaalde databasefuncties aan te roepen. Deze methoden worden gedefinieerd als extensiemethoden voor EF.Functions en moeten worden gebruikt in LINQ-query's. Deze methoden zijn providerspecifiek omdat ze nauw zijn gekoppeld aan bepaalde databasefuncties. Een methode die voor één provider werkt, werkt dus waarschijnlijk niet voor een andere provider. Aangezien de bedoeling van deze methoden is om een databasefunctie aan te roepen in de vertaalde query, resulteert het evalueren ervan op de client in een uitzondering.
Door de gebruiker gedefinieerde functie-mapping
Naast toewijzingen van EF Core-providers kunnen gebruikers ook aangepaste toewijzingen definiëren. Een door de gebruiker gedefinieerde toewijzing breidt de queryvertaling uit op basis van de behoeften van de gebruiker. Deze functionaliteit is handig wanneer er door de gebruiker gedefinieerde functies in de database zijn, die de gebruiker wil aanroepen vanuit de LINQ-query.