Procédure : appeler des fonctions définies par modèle dans des requêtes (LINQ to Entities)

Cette rubrique explique comment appeler des fonctions définies dans le modèle conceptuel à partir de requêtes LINQ to Entities .

La procédure suivante fournit un plan de haut niveau pour appeler une fonction définie par modèle à partir d'une requête LINQ to Entities . L'exemple qui suit fournit plus de détails sur les étapes de la procédure. La procédure suppose que vous avez défini une fonction dans le modèle conceptuel. Pour plus d'informations, consultez How to: Define Custom Functions in the Conceptual Model.

Pour appeler une fonction définie dans le modèle conceptuel

  1. Ajoutez une méthode CLR (Common Language Runtime) à votre application qui se mappe à la fonction définie dans le modèle conceptuel. Pour mapper la méthode, vous devez lui appliquer un attribut EdmFunctionAttribute. Notez que les paramètres NamespaceName et FunctionName de l'attribut correspondent respectivement au nom de l'espace de noms du modèle conceptuel et au nom de la fonction du modèle conceptuel. La résolution des noms de fonctions pour LINQ respecte la casse.

  2. Appelez la fonction dans une requête LINQ to Entities .

Exemple

L'exemple suivant montre comment appeler une fonction définie dans le modèle conceptuel à partir d'une requête LINQ to Entities . L'exemple utilise le modèle School. Pour plus d'informations sur le modèle School, consultez Création de l'exemple de base de données School (Démarrage rapide d'Entity Framework) et Génération du fichier School.edmx (Démarrage rapide d'Entity Framework).

La fonction de modèle conceptuel suivante retourne le nombre d'années écoulées depuis l'embauche d'un formateur. Pour plus d'informations sur l'ajout de la fonction à un modèle conceptuel, consultez How to: Define Custom Functions in the Conceptual Model.

<Function Name="YearsSince" ReturnType="Edm.Int32">
  <Parameter Name="date" Type="Edm.DateTime" />
  <DefiningExpression>
    Year(CurrentDateTime()) - Year(date)
  </DefiningExpression>
</Function>

Ensuite, ajoutez la méthode suivante à votre application et utilisez un objet EdmFunctionAttribute pour la mapper à la fonction de modèle conceptuel :

<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
    As Integer
    Throw New NotSupportedException("Direct calls are not supported.")
End Function
[EdmFunction("SchoolModel", "YearsSince")]
public static int YearsSince(DateTime date)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

Vous pouvez à présent appeler la fonction de modèle conceptuel à partir d'une requête LINQ to Entities . Le code suivant appelle la méthode pour afficher tous les formateurs embauchés il y a plus de dix ans :

Using context As New SchoolEntities()
    ' Retrieve instructors hired more than 10 years ago.
    Dim instructors = From p In context.People _
        Where YearsSince(CType(p.HireDate, DateTime?)) > 10 _
        Select p

    For Each instructor In instructors
        Console.WriteLine(instructor.LastName)
    Next
End Using
using (SchoolEntities context = new SchoolEntities())
{
    // Retrieve instructors hired more than 10 years ago.
    var instructors = from p in context.People
                      where YearsSince((DateTime)p.HireDate) > 10
                      select p;

    foreach (var instructor in instructors)
    {
        Console.WriteLine(instructor.LastName);
    }
}

Voir aussi

Tâches

Procédure : appeler des fonctions définies par modèle comme des méthodes d'objet (LINQ to Entities)

Concepts

Requêtes dans LINQ to Entities
Appel de fonctions dans les requêtes LINQ to Entities

Autres ressources

.edmx File Overview