Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Databasfunktioner är databasekvivalenten för C#-metoder. En databasfunktion kan anropas med noll eller fler parametrar och beräknar resultatet baserat på parametervärdena. De flesta databaser, som använder SQL för frågor, har stöd för databasfunktioner. Sql som genereras av EF Core-frågeöversättning tillåter därför även att databasfunktioner anropas. C#-metoder behöver inte översättas strikt till databasfunktioner i EF Core.
- En C#-metod kanske inte har någon motsvarande databasfunktion.
- String.IsNullOrEmpty -metoden översätts till en null-kontroll och en jämförelse med en tom sträng i databasen i stället för en funktion.
- String.Equals(String, StringComparison) -metoden har inte databasmotsvarighet eftersom strängjämförelse inte kan representeras eller efterliknas enkelt i en databas.
- En databasfunktion kanske inte har någon motsvarande C#-metod. Operatorn
??i C#, som inte har någon metod, översätts tillCOALESCEfunktionen i databasen.
Typer av databasfunktioner
EF Core SQL-generering stöder en delmängd funktioner som kan användas i databaser. Den här begränsningen beror på möjligheten att representera en fråga i LINQ för den angivna databasfunktionen. Dessutom har varje databas varierande stöd för databasfunktioner, så EF Core tillhandahåller en gemensam delmängd. En databasprovider kan utöka EF Core SQL-genereringen för att stödja fler mönster. Följande är de typer av databasfunktioner som EF Core stöder och unikt identifierar. Dessa termer hjälper också till att förstå vilka översättningar som är inbyggda med EF Core-leverantörer.
Inbyggda kontra användardefinierade funktioner
Inbyggda funktioner levereras med en fördefinierad databas, men användardefinierade funktioner definieras uttryckligen av användaren i databasen. När EF Core översätter frågor till att använda databasfunktioner använder den inbyggda funktioner för att se till att funktionen alltid är tillgänglig i databasen. Skillnaden mellan inbyggda funktioner är nödvändig i vissa databaser för att generera SQL korrekt. SqlServer kräver till exempel att varje användardefinierad funktion anropas med ett schemabestämt namn. Men inbyggda funktioner i SqlServer har inget schema. PostgreSQL definierar inbyggd funktion i public schemat, men de kan anropas med schemakvalificerade namn.
Aggregat- vs skalära vs tabellvärdefunktioner
- Skalära funktioner tar skalärvärden – till exempel heltal eller strängar – som parametrar och returnerar ett skalärt värde som resultat. Skalära funktioner kan användas var som helst i SQL där ett skalärt värde kan skickas.
- Aggregerade funktioner tar en ström med skalära värden som parametrar och returnerar ett skalärt värde som resultat. Mängdfunktioner tillämpas på hela frågeresultatet eller på en grupp värden som genereras genom att tillämpa operatorn
GROUP BY. - Tabellvärdesfunktioner tar skalära värden som parametrar och returnerar en dataström med rader som resultat. Tabellvärdesfunktioner används som tabellkälla i
FROM-sats.
Niladic-funktioner
Niladic-funktioner är särskilda databasfunktioner som inte har några parametrar och måste anropas utan parentes. De liknar egenskaps-/fältåtkomst på en instans i C#. Niladic-funktioner skiljer sig från parameterlösa funktioner eftersom de senare kräver tom parentes. Det finns inget särskilt namn för databasfunktioner som alltid kräver parentes. En annan delmängd av databasfunktioner baserade på parameterantal är variadiska funktioner. Variadiska funktioner kan ta varierande antal parametrar när de anropas.
Databasfunktionsmappningar i EF Core
EF Core stöder tre olika sätt att mappa mellan C#-funktioner och databasfunktioner.
Inbyggd funktionsmappning
Som standard tillhandahåller EF Core-leverantörer mappningar för olika inbyggda funktioner över primitiva typer. Exempelvis översätts String.ToLower() till LOWER i Sql Server. Med den här funktionen kan användare skriva frågor i LINQ sömlöst. Vi tillhandahåller vanligtvis en översättning i databasen som ger samma resultat som C#-funktionen ger på klientsidan. Ibland kan den faktiska översättningen vara något mer komplicerad än en databasfunktion. I vissa scenarier tillhandahåller vi även den lämpligaste översättningen i stället för att matcha C#-semantik. Samma funktion används också för att tillhandahålla vanliga översättningar för vissa av C#-medlemsåtkomsterna. Exempelvis översätts String.Length till LEN i Sql Server. Förutom leverantörer kan plugin-skribenter också lägga till ytterligare översättningar. Den här utökningsbarheten är användbar när plugin-program lägger till stöd för fler typer som primitiva typer och vill översätta metoder över dem.
EF. Funktionsmappning
Eftersom inte alla databasfunktioner har motsvarande C#-funktioner har EF Core-leverantörer särskilda C#-metoder för att anropa vissa databasfunktioner. Dessa metoder definieras som tilläggsmetoder för EF.Functions att användas i LINQ-frågor. Dessa metoder är providerspecifika eftersom de är nära knutna till vissa databasfunktioner. En metod som fungerar för en leverantör fungerar förmodligen inte för någon annan provider. Eftersom avsikten med dessa metoder är att anropa en databasfunktion i den översatta frågan, resulterar försök att utvärdera dem på klienten i ett undantag.
Användardefinierad funktionsmappning
Förutom mappningar som tillhandahålls av EF Core-leverantörer kan användarna också definiera anpassad mappning. En användardefinierad mappning utökar frågeöversättningen enligt användarens behov. Den här funktionen är användbar när det finns användardefinierade funktioner i databasen, som användaren vill anropa från sin LINQ-fråga.