Dela via


Anvisningar: Anropa modelldefinierade funktioner i frågor

Det här avsnittet beskriver hur du anropar funktioner som definieras i den konceptuella modellen från LINQ till entitetsfrågor.

Proceduren nedan innehåller en övergripande disposition för att anropa en modelldefinierad funktion från en LINQ till entitetsfråga. Exemplet nedan innehåller mer information om stegen i proceduren. Proceduren förutsätter att du har definierat en funktion i den konceptuella modellen. Mer information finns i Så här: Definiera anpassade funktioner i konceptmodellen.

Anropa en funktion som definierats i den konceptuella modellen

  1. Lägg till en CLR-metod (Common Language Runtime) i ditt program som mappar till funktionen som definieras i den konceptuella modellen. Om du vill mappa metoden måste du använda en EdmFunctionAttribute för -metoden. Observera att parametrarna NamespaceName och FunctionName för attributet är namnområdesnamnet för den konceptuella modellen respektive funktionsnamnet i den konceptuella modellen. Funktionsnamnmatchning för LINQ är skiftlägeskänslig.

  2. Anropa funktionen i en LINQ till entitetsfråga.

Exempel 1

I följande exempel visas hur du anropar en funktion som definieras i den konceptuella modellen från en LINQ till entitetsfråga. I exemplet används skolmodellen. Information om skolmodellen finns i Skapa skolexempeldatabasen och generera filen School .edmx.

Följande konceptmodellfunktion returnerar antalet år sedan en instruktör anställdes. Information om hur du lägger till funktionen i en konceptmodell finns i Så här definierar du anpassade funktioner i den konceptuella modellen.

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

Exempel 2

Lägg sedan till följande metod i ditt program och använd en EdmFunctionAttribute för att mappa den till den konceptuella modellfunktionen:

[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

Exempel 3

Nu kan du anropa den konceptuella modellfunktionen från en LINQ till entitetsfråga. Följande kod anropar metoden för att visa alla instruktörer som anställdes för mer än tio år sedan:

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

Se även