Share via


Gewusst wie: Aufrufen von benutzerdefinierten Datenbankfunktionen (LINQ to Entities)

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 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

Das folgende Beispiel zeigt, wie eine benutzerdefinierte Datenbankfunktion innerhalb einer LINQ to Entities-Abfrage aufgerufen wird. Im Beispiel wird das Modell "School" verwendet. Weitere Informationen zum Modell "School" finden Sie unter Erstellen der Beispieldatenbank "School" (Entity Framework-Schnellstart) und Erstellen der EDMX-Datei für das Modell 'School' (Entity Framework-Schnellstart).

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

Dd456847.note(de-de,VS.100).gifHinweis:
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

Beschreiben Sie nun in der Datenspeicherschema-Definitionssprache (SSDL) der EDMX-Datei eine Funktion. Der folgenden Code beschreibt die AvgStudentGrade-Funktion in SSDL:

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

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

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

Siehe auch

Konzepte

Abfragen in LINQ to Entities

Weitere Ressourcen

.edmx File Overview