Aufrufen modelldefinierter Funktionen in Abfragen
In diesem Thema erfahren Sie, wie Funktionen, die im konzeptionellen Modell definiert sind, im Rahmen von LINQ to Entities-Abfragen aufgerufen werden.
Das nachfolgende Verfahren bietet einen allgemeinen Überblick über das Aufrufen einer im Modell definierten Funktion im Rahmen einer LINQ to Entities-Abfrage. Das folgende Beispiel enthält weitere Details zu den Schritten in der Prozedur. In dem Verfahren wird davon ausgegangen, dass eine Funktion im konzeptionellen Modell definiert wurde. Weitere Informationen finden Sie unter Gewusst wie: Definieren benutzerdefinierter Funktionen im konzeptionellen Modell.
So rufen Sie eine im konzeptionellen Modell definierte Funktion auf
Fügen Sie der Anwendung, die der im konzeptionellen Modell definierten Funktion zugeordnet ist, eine Common Language Runtime (CLR)-Methode hinzu. Zum Zuordnen der Methode müssen Sie ein EdmFunctionAttribute für die Methode übernehmen. Beachten Sie, dass der NamespaceName-Parameter und der FunctionName-Parameter des Attributs den Namespacenamen bzw. den Funktionsnamen im konzeptionellen Modell darstellen. Bei der Funktionsnamenauflösung für LINQ wird die Groß-/Kleinschreibung berücksichtigt.
Rufen Sie die Funktion in einer LINQ to Entities-Abfrage auf.
Beispiel 1
Im folgenden Beispiel wird veranschaulicht, wie eine im konzeptionellen Modell definierte Funktion im Rahmen einer LINQ to Entities-Abfrage aufgerufen wird. Im Beispiel wird das Modell "School" verwendet. Informationen zum School-Modell finden Sie unter Erstellen der Beispieldatenbank "School" (Entity Framework-Schnellstart) sowie unter Erstellen der EDMX-Datei für das Modell 'School' (Entity Framework-Schnellstart).
Die folgende konzeptionelle Modellfunktion gibt die Anzahl der Jahre zurück, die seit der Einstellung einer Lehrkraft vergangen sind. Informationen zum Hinzufügen der Funktion zu einem konzeptionellen Modell finden Sie unter Gewusst wie: Definieren von benutzerdefinierten Funktionen im konzeptionellen Modell (Entity Framework).
<Function Name="YearsSince" ReturnType="Edm.Int32">
<Parameter Name="date" Type="Edm.DateTime" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(date)
</DefiningExpression>
</Function>
Beispiel 2
Fügen Sie der Anwendung danach die folgende Methode hinzu, und verwenden Sie ein EdmFunctionAttribute, um sie der Funktion im konzeptionellen Modell zuzuordnen:
[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
Beispiel 3
Jetzt können Sie die im konzeptionellen Modell definierte Funktion im Rahmen einer LINQ to Entities-Abfrage aufrufen. Im folgenden Code wird die Methode aufgerufen, um alle Lehrkräfte anzuzeigen, die vor mehr als zehn Jahren eingestellt wurden:
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