Fonctions table (TVFs)

Remarque

EF5 et ultérieur uniquement : les fonctionnalités, les API, etc. décrites dans cette page ont été introduites dans Entity Framework 5. Si vous utilisez une version antérieure, certaines ou toutes les informations ne s’appliquent pas.

La vidéo et la procédure pas à pas montrent comment mapper des fonctions table (TVFs) en utilisant Entity Framework Designer. Elle montre aussi comment appeler un TVF depuis une requête LINQ.

Les fichiers TVF ne sont actuellement pris en charge que dans le flux de travail Database First.

La prise en charge des TVF a été introduite dans Entity Framework version 5. Notez que pour utiliser les nouvelles fonctionnalités comme les fonctions table, enums et les types spatiaux, vous devez cibler .NET Framework 4.5. Visual Studio 2012 cible .NET 4.5 par défaut.

Les fichiers TVF sont très similaires aux procédures stockées avec une différence clé : le résultat d’un TVF est composable. Cela signifie que les résultats d’une fonction TVF peuvent être utilisés dans une requête LINQ, tandis que les résultats d’une procédure stockée ne peuvent pas.

Regardez la vidéo

Présentée par : Julia Kornich

WMV | MP4 | WMV (ZIP)

Conditions préalables

Pour exécuter cette procédure pas à pas, vous avez besoin des éléments suivants :

Configurer le projet

  1. Ouvrez Visual Studio.
  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet
  3. Dans le volet de gauche, cliquez sur Visual C#, puis sélectionnez le modèle Console
  4. Entrez TVF comme nom du projet, puis cliquez sur OK

Ajoute un TVF à la base de données

  • Sélectionnez Affichage ->Explorateur d’objets SQL Server
  • Si LocalDB n’est pas dans la liste des serveurs, cliquez avec le bouton droit sur SQL Server, puis sélectionnez Ajouter SQL Server Utiliser l’Authentification Windows par défaut pour vous connecter au serveur LocalDB
  • Développer le nœud LocalDB
  • Sous le nœud Bases de données, cliquez avec le bouton droit sur le nœud de base de données Scolaire, puis sélectionnez Nouvelle requête…
  • Dans l’Éditeur T-SQL, collez la définition TVF suivante
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • Cliquez sur le bouton droit de la souris sur l’éditeur T-SQL, puis sélectionnez Exécuter
  • La fonction GetStudentGradesForCourse est ajoutée à la base de données School

 

Créer un modèle

  1. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur le nom du projet, pointez sur Ajouter, puis cliquez sur Nouvel élément
  2. Sélectionnez Données dans le menu de gauche, puis sélectionnez ADO.NET Entity Data Model dans le menu des Modèles
  3. Entrez TVFModel.edmx comme nom de fichier, puis cliquez sur Ajouter
  4. Dans la boîte de dialogue Choisir le contenu du modèle, sélectionnez Générer à partir de la base de données, puis cliquez sur Suivant
  5. Cliquez sur nouvelle connexion Entrer (localdb)\mssqllocaldb dans la zone de texte Nom du serveur Entrée School pour le nom de la base de données Cliquez sur OK
  6. Dans la boîte de dialogue Choisir vos objets de base de donnée, sous le nœud Tables et sélectionnez la table Personne., StudentGrade, et Course
  7. Sélectionnez la fonction GetStudentGradesForCourse située sous la procédures stockées et fonctions nœud Remarque, qui à partir de Visual Studio 2012, le Concepteur d’entités vous permet d’importer par lot vos procédures stockées et fonctions
  8. Cliquez sur Terminer
  9. Le Concepteur d'entités, qui fournit une aire de conception permettant de modifier votre modèle, est affiché. Tous les objets que vous avez sélectionnés dans la boîte de dialogue Choisir vos objets de base de données sont ajoutés au modèle.
  10. Par défaut, la forme de résultat de chaque procédure stockée ou fonction importée devient automatiquement un nouveau type complexe dans votre modèle d’entité. Mais nous voulons mapper les résultats de la fonction GetStudentGradesForCourse à l’entité StudentGrade : cliquez avec le bouton droit sur l’aire de conception, puis sélectionnez Explorateur de modèles Dans l’Explorateur de modèles, sélectionnez Function Imports, puis double-cliquez sur la fonction GetStudentGradesForCourse dans la boîte de dialogue Modifier l’importation de fonction, sélectionnez Entités et choisissez StudentGrade

Conserver et récupérer des données

Ouvrez le fichier où la méthode Main est définie. Ajoutez le code suivant dans la fonction Main.

Le code suivant montre comment générer une requête qui utilise une fonction table. La requête projette les résultats dans un type anonyme qui contient le titre de cours associé et les étudiants associés avec une note supérieure ou égale à 3,5.

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;

    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };

    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title,  
            result.Person.FirstName,  
            result.Person.LastName);
    }
}

Compilez et exécutez l'application. Le programme génère la sortie suivante :

Couse: Microeconomics, Student: Arturo Anand
Couse: Microeconomics, Student: Carson Bryant

Résumé

Dans cette procédure pas à pas, nous voyons comment mapper des fonctions table (TVFs) en utilisant Entity Framework Designer. Elle montre aussi comment appeler un TVF depuis une requête LINQ.