Tabellenwertfunktionen (TVFs)

Hinweis

Nur EF5 und höher: – Die Features, APIs usw., die auf dieser Seite erläutert werden, wurden in Entity Framework 5 eingeführt. Wenn Sie eine frühere Version verwenden, gelten manche Informationen nicht.

In diesem Video und dieser exemplarischen Vorgehensweise wird Schritt für Schritt gezeigt, wie Tabellenwertfunktionen (TVFs) mit dem Entity Framework-Designer zugeordnet werden können. Außerdem wird veranschaulicht, wie Sie eine TVF aus einer LINQ-Abfrage aufrufen.

TVFs werden derzeit nur im Database First-Workflow unterstützt.

Die TVF-Unterstützung wurde in Entity Framework Version 5 eingeführt. Für die Verwendung der neuen Features wie Tabellenwertfunktionen, Enumerationen und räumliche Datentypen muss .NET Framework 4.5 angezielt werden. Visual Studio 2012 zielt standardmäßig NET 4.5 an.

TVFs sind gespeicherten Prozeduren sehr ähnlich, mit einem entscheidenden Unterschied: Das Ergebnis einer TVF ist zusammensetzbar. Das bedeutet, dass die Ergebnisse einer TVF in einer LINQ-Abfrage verwendet werden können, während dies für die Ergebnisse einer gespeicherten Prozedur nicht möglich ist.

Video ansehen

Präsentiert von: Julia Kornich

WMV | MP4 | WMV (ZIP)

Voraussetzungen

Um diese exemplarische Vorgehensweise nachzuvollziehen, benötigen Sie Folgendes:

  • Installieren Sie die School-Datenbank.

  • Eine aktuelle Version von Visual Studio

Einrichten des Projekts

  1. Öffnen Sie Visual Studio.
  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt
  3. Klicken Sie im linken Bereich auf Visual C#, und wählen Sie dann die Konsolen-Vorlage aus
  4. Geben Sie TVF als Namen des Projekts ein, und klicken Sie auf OK

Hinzufügen einer TVF zur Datenbank

  • Wählen Sie Ansicht -> SQL Server-Objekt-Explorer aus
  • Wenn LocalDB nicht in der Liste der Server enthalten ist: Klicken Sie auf der rechten Maustaste auf SQL Server, und wählen Sie SQL Server hinzufügen aus. Verwenden Sie die übliche Windows-Authentifizierung, um eine Verbindung mit dem LocalDB-Server herzustellen
  • Erweitern des LocalDB-Knotens
  • Klicken Sie unter dem Knoten „Datenbanken“ mit der rechten Maustaste auf den Datenbankknoten „School“, und wählen Sie Neue Abfrage… aus
  • Fügen Sie im T-SQL-Editor die folgende TVF-Definition ein
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • Klicken Sie mit der rechten Maustaste auf den T-SQL-Editor, und wählen Sie Ausführen aus
  • Die Funktion „GetStudentGradesForCourse“ wird der Datenbank „School“ hinzugefügt

 

Modellerstellung

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen und anschließend auf Neues Element
  2. Wählen Sie Daten im linken Menü aus, und wählen Sie dann im Bereich Vorlagen ADO.NET Entity Data Model aus
  3. Geben Sie TVFModel.edmx für den Dateinamen ein, und klicken Sie dann auf Hinzufügen
  4. Wählen Sie im Dialogfeld „Auswählen des Modellinhalts“ die Option Aus Datenbank generieren aus, und klicken Sie dann auf Weiter
  5. Klicken Sie im Textfeld „Servername“ auf Neue Verbindung Geben Sie (localdb)\mssqllocaldb im Textfeld „Servername“ ein Geben Sie School für den Datenbanknamen ein Klicken Sie auf OK
  6. Wählen Sie im Dialogfeld „Datenbankobjekte auswählen“ unter dem Knoten Tabellen die Tabellen Person, StudentGrade, and Course aus
  7. Wählen Sie die Funktion GetStudentGradesForCourse aus, die sich unter dem Knoten Gespeicherte Prozeduren und Funktionen befindet. Ab Visual Studio 2012 ermöglicht ihnen der Entity Designer das Batchimport ihrer gespeicherten Prozeduren und Funktionen
  8. Klicken Sie auf Fertig stellen.
  9. Der Entity Designer, der eine Entwurfsoberfläche zum Bearbeiten Ihres Modells bereitstellt, wird angezeigt. Alle Objekte, die Sie im Dialogfeld Datenbankobjekte auswählen ausgewählt haben, werden dem Modell hinzugefügt.
  10. Standardmäßig wird die Ergebnisform jeder importierten gespeicherten Prozedur oder Funktion automatisch zu einem neuen komplexen Typ in Ihrem Entitätsmodell. Aber wir möchten die Ergebnisse der GetStudentGradesForCourse-Funktion der StudentGrade-Entität zuordnen: Klicken Sie mit der rechten Maustaste auf die Entwurfsoberfläche, wählen Sie den Modellbrowser im Modellbrowser aus, wählen Sie Funktionsimporte aus, und doppelklicken Sie dann im Dialogfeld „Funktionsimport bearbeiten“ auf die Funktion GetStudentGradesForCourse, wählen Sie Entitäten aus, und dann StudentGrade

Speichern und Abrufen von Daten

Öffnen Sie die Datei, in der die Main-Methode definiert ist. Fügen Sie der Main-Funktion den folgenden Code hinzu.

Der folgende Code veranschaulicht das Erstellen einer Abfrage, die eine Tabellenwertfunktion verwendet. Die Abfrage projiziert die Ergebnisse in einen anonymen Typ, der den zugehörigen Kurstitel und verwandte Schüler mit einer Klasse größer oder gleich 3,5 enthält.

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;

    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };

    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title,  
            result.Person.FirstName,  
            result.Person.LastName);
    }
}

Kompilieren Sie die Anwendung, und führen Sie sie aus. Das Programm erzeugt die folgende Ausgabe:

Couse: Microeconomics, Student: Arturo Anand
Couse: Microeconomics, Student: Carson Bryant

Zusammenfassung

In dieser exemplarischen Vorgehensweise haben wir untersucht, wie Tabellenwertfunktionen (TVFs) mithilfe des Entity Framework-Designers zugeordnet werden. Außerdem wurde veranschaulicht, wie Sie eine TVF aus einer LINQ-Abfrage aufrufen.