Guide pratique pour appeler des fonctions définies par modèle dans les requêtes

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 Procédure : définir des fonctions personnalisées dans le modèle conceptuel.

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 1

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 et Génération du fichier School .edmx.

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 Guide pratique pour définir des fonctions personnalisées dans le modèle conceptuel.

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

Exemple 2

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 static int YearsSince(DateTime date)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
    As Integer
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Exemple 3

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 (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);
    }
}
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

Voir aussi