Delen via


Procedure: Door model gedefinieerde functies aanroepen in query's

In dit onderwerp wordt beschreven hoe u functies aanroept die zijn gedefinieerd in het conceptuele model vanuit LINQ naar entiteitenquery's.

De onderstaande procedure biedt een overzicht op hoog niveau voor het aanroepen van een door een model gedefinieerde functie vanuit een LINQ naar entiteitenquery. In het volgende voorbeeld vindt u meer informatie over de stappen in de procedure. In de procedure wordt ervan uitgegaan dat u een functie hebt gedefinieerd in het conceptuele model. Zie Voor meer informatie : Aangepaste functies definiƫren in het conceptuele model.

Een functie aanroepen die is gedefinieerd in het conceptuele model

  1. Voeg een CLR-methode (Common Language Runtime) toe aan uw toepassing die is toegewezen aan de functie die is gedefinieerd in het conceptuele model. Als u de methode wilt toewijzen, moet u een EdmFunctionAttribute op de methode toepassen. Houd er rekening mee dat de NamespaceName en FunctionName parameters van het kenmerk respectievelijk de naamruimtenaam van het conceptuele model en de functienaam in het conceptuele model zijn. Functienaamomzetting voor LINQ is hoofdlettergevoelig.

  2. Roep de functie in een LINQ aan bij entiteitenquery.

Voorbeeld 1

In het volgende voorbeeld ziet u hoe u een functie aanroept die is gedefinieerd in het conceptuele model vanuit een LINQ naar entiteitenquery. In het voorbeeld wordt het schoolmodel gebruikt. Zie De schoolvoorbeelddatabase maken en het .edmx-bestand van school genereren voor meer informatie over het schoolmodel.

De volgende conceptuele modelfunctie retourneert het aantal jaren sinds een docent is ingehuurd. Zie Instructies voor het definiƫren van aangepaste functies in het conceptuele model voor informatie over het toevoegen van de functie aan een conceptueel model.

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

Voorbeeld 2

Voeg vervolgens de volgende methode toe aan uw toepassing en gebruik een EdmFunctionAttribute methode om deze toe te wijzen aan de conceptuele modelfunctie:

[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

Voorbeeld 3

U kunt nu de conceptuele modelfunctie aanroepen vanuit een LINQ naar entiteitenquery. Met de volgende code wordt de methode aangeroepen om alle instructeurs weer te geven die meer dan tien jaar geleden zijn ingehuurd:

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

Zie ook