Freigeben über


Vorgehensweise: Aufrufen benutzerdefinierter Datenbankfunktionen

In diesem Thema wird das Aufrufen von benutzerdefinierten Funktionen beschrieben, die in der Datenbank in LINQ to Entities-Abfragen definiert werden.

Datenbankfunktionen, die von LINQ to Entities-Abfragen aufgerufen werden, werden in der Datenbank ausgeführt. Das Ausführen von Funktionen in der Datenbank kann die Anwendungsleistung verbessern.

Die folgende Prozedur stellt in knapper Form dar, wie eine benutzerdefinierte Datenbankfunktion aufgerufen wird. Das folgende Beispiel enthält weitere Details zu den Schritten in der Prozedur.

So rufen Sie benutzerdefinierte Funktionen auf, die in der Datenbank definiert sind

  1. Erstellen Sie in der Datenbank eine benutzerdefinierte Funktion.

    Weitere Informationen zum Erstellen von benutzerdefinierten Funktionen in SQL Server finden Sie unter CREATE FUNCTION (Transact-SQL).

  2. Beschreiben Sie in der Datenspeicherschema-Definitionssprache (SSDL) der EDMX-Datei eine Funktion. Der Name der Funktion muss mit der in der Datenbank deklarierten Funktion übereinstimmen.

    Weitere Informationen finden Sie unter dem Function-Element (SSDL).

  3. Fügen Sie einer Klasse im Anwendungscode eine entsprechende Methode hinzu, und übernehmen Sie ein EdmFunctionAttribute für die Methode. Der NamespaceName-Parameter und der FunctionName-Parameter des Attributs sind die Namespacebezeichnung des konzeptionellen Modells bzw. der Funktionsname im konzeptionellen Modell. Bei der Funktionsnamenauflösung für LINQ wird die Groß-/Kleinschreibung berücksichtigt.

  4. Rufen Sie die Methode in einer LINQ to Entities-Abfrage auf.

Beispiel 1

Das folgende Beispiel zeigt, wie eine benutzerdefinierte Datenbankfunktion innerhalb 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).

Der folgende Code fügt die AvgStudentGrade-Funktion der Beispieldatenbank "School" hinzu.

Hinweis

Die Schritte zum Aufrufen einer benutzerdefinierten Datenbankfunktion sind unabhängig vom Datenbankserver identisch. Der folgende Code wird jedoch speziell für die Erstellung einer Funktion in einer SQL Server-Datenbank verwendet. Der Code zum Erstellen einer benutzerdefinierten Funktion in einem anderen Datenbankserver kann ggf. abweichen.

USE [School]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[AvgStudentGrade](@studentId INT)
RETURNS DECIMAL(3,2)
AS
    BEGIN
    DECLARE @avg DECIMAL(3,2);
    SELECT @avg = avg(Grade) FROM StudentGrade WHERE StudentID = @studentId;

    RETURN @avg;
END

Beispiel 2

Deklarieren Sie als Nächstes in der Datenspeicherschema-Definitionssprache (SSDL) der EDMX-Datei eine Funktion. Der folgenden Code deklariert die AvgStudentGrade-Funktion in SSDL:

<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
  <Parameter Name="studentId" Mode="In" Type="int" />
</Function>

Beispiel 3

Erstellen Sie jetzt eine Methode, und ordnen Sie sie der in der SSDL beschriebenen Funktion zu. Die Methode in der folgenden Klasse wird der Funktion zugeordnet, die in der SSDL (oben) mithilfe eines EdmFunctionAttribute definiert wurde. Wird diese Methode aufgerufen, wird die entsprechende Funktion in der Datenbank ausgeführt.

[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel.Store", "AvgStudentGrade")>
Public Function AvgStudentGrade(ByVal studentId As Integer) _
    As Nullable(Of Decimal)
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Beispiel 4

Rufen Sie schließlich die Methode in einer LINQ to Entities-Abfrage auf. Im folgenden Code werden die Nachnamen und Durchschnittsnoten von Schülern auf der Konsole angezeigt:

using (SchoolEntities context = new SchoolEntities())
{
    var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };

    foreach (var student in students)
    {
        Console.WriteLine("{0}: {1}", student.name, student.avgGrade);
    }
}
Using context As New SchoolEntities()
    Dim students = From s In context.People _
                   Where s.EnrollmentDate IsNot Nothing _
                   Select New With {.name = s.LastName, _
                                   .avgGrade = AvgStudentGrade(s.PersonID)}

    For Each student In students
        Console.WriteLine("{0}: {1}", _
                            student.name, _
                            student.avgGrade)
    Next
End Using

Siehe auch