Fonctions de base de données
Les fonctions de base de données sont l’équivalent de la base de données des méthodes C#. Une fonction de base de données peut être appelée avec zéro ou plusieurs paramètres et calcule le résultat en fonction des valeurs de paramètre. La plupart des bases de données, qui utilisent SQL pour l’interrogation, prennent en charge les fonctions de base de données. Par conséquent, le langage SQL généré par la traduction de requêtes EF Core permet également d’appeler des fonctions de base de données. Les méthodes C# n’ont pas besoin de se traduire strictement en fonctions de base de données dans EF Core.
- Une méthode C# ne peut pas avoir une fonction de base de données équivalente.
- La méthode String.IsNullOrEmpty se traduit par un contrôle de valeur null et une comparaison avec une chaîne vide dans la base de données plutôt qu’une fonction.
- La méthode String.Equals(String, StringComparison) n’a pas d’équivalent de base de données, car la comparaison de chaînes ne peut pas être représentée ni imitée facilement dans une base de données.
- Une fonction de base de données peut ne pas avoir une méthode C# équivalente. L’opérateur
??
en C#, qui n’a aucune méthode, se traduit par la fonctionCOALESCE
dans la base de données.
Types de fonctions de base de données
EF Core génération SQL prend en charge un sous-ensemble de fonctions qui peuvent être utilisées dans les bases de données. Cette limitation provient de la possibilité de représenter une requête dans LINQ pour la fonction de base de données donnée. En outre, chaque base de données a une prise en charge différente des fonctions de base de données, de sorte qu’EF Core fournit un sous-ensemble commun. Un fournisseur de base de données est libre d’étendre EF Core génération SQL pour prendre en charge davantage de modèles. Voici les types de fonctions de base de données qu’EF Core prend en charge et identifie de manière unique. Ces termes permettent également de comprendre les traductions intégrées aux fournisseurs d’EF Core.
Fonctions intégrées vs définies par l’utilisateur
Les fonctions intégrées sont fournies avec la base de données prédéfinie, mais les fonctions définies par l’utilisateur sont définies explicitement par l’utilisateur dans la base de données. Lorsqu’EF Core traduit des requêtes pour utiliser des fonctions de base de données, il utilise des fonctions intégrées pour s’assurer que la fonction est toujours disponible dans la base de données. La distinction entre les fonctions intégrées est nécessaire dans certaines bases de données pour générer SQL correctement. Par exemple, SqlServer requiert que chaque fonction définie par l’utilisateur soit appelée avec un nom qualifié par un schéma. Toutefois, les fonctions intégrées dans SqlServer n’ont pas de schéma. PostgreSQL définit la fonction intégrée dans le schéma public
, mais elles peuvent être appelées avec des noms qualifiés de schéma.
Fonctions d’agrégation vs fonctions scalaires vs fonctions table
- Les fonctions scalaires prennent des valeurs scalaires, comme des paramètres ou des chaînes, et retournent une valeur scalaire comme résultat. Les fonctions scalaires peuvent être utilisées n’importe où dans SQL où une valeur scalaire peut être passée.
- Les fonctions d’agrégation prennent un flux de valeurs scalaires en tant que paramètres et retournent une valeur scalaire comme résultat. Les fonctions d’agrégation sont appliquées à l’ensemble du jeu de résultats de la requête ou à un groupe de valeurs générées en appliquant l’opérateur
GROUP BY
. - Les fonctions table acceptent des valeurs scalaires comme paramètres et retournent un flux de lignes comme résultat. Les fonctions table sont utilisées comme une clause table source dans
FROM
.
Fonctions niladic
Les fonctions niladic sont des fonctions de base de données spéciales qui n’ont pas de paramètres et doivent être appelées sans parenthèses. Elles sont similaires à l’accès aux propriétés/champs sur une instance en C#. Les fonctions niladic diffèrent des fonctions sans paramètre, car cette dernière nécessite des parenthèses vides. Il n’existe pas de nom spécial pour les fonctions de base de données qui nécessitent toujours des parenthèses. Un autre sous-ensemble des fonctions de base de données basées sur le nombre de paramètres est constitué de fonctions variadiques. Les fonctions variadiques peuvent prendre un nombre variable de paramètres lorsqu’elles sont appelées.
Mappages de fonctions de base de données dans EF Core
EF Core prend en charge trois méthodes différentes de mappage entre les fonctions C# et les fonctions de base de données.
Mappages de fonctions intégrées
Par défaut, les fournisseurs EF Core fournissent des mappages pour diverses fonctions intégrées sur des types primitifs. Par exemple, String.ToLower() se traduit par LOWER
dans SqlServer. Cette fonctionnalité permet aux utilisateurs d’écrire des requêtes dans LINQ en toute simplicité. Nous fournissons généralement une traduction dans la base de données qui donne le même résultat que celui fourni par la fonction C# côté client. Parfois, pour y parvenir, la traduction réelle peut être plus complexe qu’une fonction de base de données. Dans certains scénarios, nous fournissons également la traduction la plus appropriée plutôt que la correspondance de la sémantique C#. La même fonctionnalité est également utilisée pour fournir des traductions communes pour certains des accès aux membres C#. Par exemple, String.Length se traduit par LEN
dans SqlServer. Hormis les fournisseurs, les enregistreurs de plug-ins peuvent également ajouter des traductions supplémentaires. Cette extensibilité est utile lorsque les plug-ins ajoutent la prise en charge d’autres types en tant que types primitifs et souhaitent traduire les méthodes sur eux.
Mappage EF.Functions
Dans la mesure où toutes les fonctions de base de données n’ont pas d’équivalents C#, les fournisseurs EF Core ont des méthodes C# spéciales pour appeler certaines fonctions de base de données. Ces méthodes sont définies comme méthodes d’extension sur EF.Functions
pour être utilisées dans les requêtes LINQ. Ces méthodes sont spécifiques au fournisseur, car elles sont étroitement liées à des fonctions de base de données particulières. Par conséquent, une méthode qui fonctionne pour un fournisseur ne fonctionnera probablement pas pour un autre fournisseur. En outre, étant donné que l’objectif de ces méthodes est d’appeler une fonction de base de données dans la requête traduite, essayer de les évaluer sur le client entraîne une exception.
Mappage de fonctions définies par l’utilisateur
Outre les mappages fournis par les fournisseurs d’EF Core, les utilisateurs peuvent également définir un mappage personnalisé. Un mappage défini par l’utilisateur étend la traduction des requêtes en fonction des besoins de l’utilisateur. Cette fonctionnalité est utile lorsqu’il existe des fonctions définies par l’utilisateur dans la base de données, que l’utilisateur souhaite appeler à partir de leur requête LINQ.