Entity Framework - funkcja wyceniana w tabeli

W tym rozdziale nauczmy się, jak mapować funkcje o wartościach tabelarycznych (TVF) przy użyciu Entity Framework Designer i jak wywołać TVF z zapytania LINQ.

  • TVF są obecnie obsługiwane tylko w przepływie pracy Database First.

  • Został po raz pierwszy wprowadzony w Entity Framework w wersji 5.

  • Aby korzystać z TVF, musisz kierować na .NET Framework 4.5 lub nowszy.

  • Jest bardzo podobny do procedur składowanych, ale ma jedną kluczową różnicę, tj. Wynik TVF można komponować. Oznacza to, że wyniki z TVF mogą być używane w zapytaniu LINQ, podczas gdy wyniki procedury składowanej nie mogą.

Spójrzmy na poniższy przykład tworzenia nowego projektu z Plik → Nowy → Projekt.

Step 1 - Wybierz aplikację konsoli ze środkowego panelu i wprowadź TableValuedFunctionDemo w polu nazwy.

Step 2 - W eksploratorze serwerów kliknij prawym przyciskiem myszy bazę danych.

Step 3 - Wybierz Nowe zapytanie i wprowadź następujący kod w edytorze T-SQL, aby dodać nową tabelę do bazy danych.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
   OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U'))

BEGIN

   CREATE TABLE [dbo].[StudentGrade](

      [EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
      [CourseID] [int] NOT NULL,
      [StudentID] [int] NOT NULL,
      [Grade] [decimal](3, 2) NULL,

      CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED ([EnrollmentID] ASC)

      WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

   ) ON [PRIMARY]

END
GO

Step 4 - Kliknij prawym przyciskiem myszy edytor i wybierz opcję Wykonaj.

Step 5- Kliknij prawym przyciskiem myszy swoją bazę danych i kliknij Odśwież. Zobaczysz nowo dodaną tabelę w swojej bazie danych.

Step 6- Teraz utwórz funkcję, która będzie zwracać oceny uczniów z kursu. Wprowadź następujący kod w edytorze T-SQL.

CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
   SELECT [EnrollmentID],
      [CourseID],
      [StudentID],
      [Grade]
   FROM   [dbo].[StudentGrade]
   WHERE  CourseID = @CourseID

Step 7 - Kliknij prawym przyciskiem myszy edytor i wybierz opcję Wykonaj.

Teraz możesz zobaczyć, że funkcja została utworzona.

Step 8 - Kliknij prawym przyciskiem myszy nazwę projektu w Eksploratorze rozwiązań i wybierz Dodaj → Nowy element.

Step 9 - Następnie wybierz ADO.NET Entity Data Model w okienku Szablony.

Step 10 - Wpisz TVFModel jako nazwę, a następnie kliknij przycisk Dodaj.

Step 11 - W oknie dialogowym Wybierz zawartość modelu wybierz projektanta EF z bazy danych, a następnie kliknij przycisk Dalej.

Step 12 - Wybierz bazę danych i kliknij Dalej.

Step 13 - W oknie dialogowym Wybierz obiekty bazy danych wybierz tabele, widoki.

Step 14 - Wybierz funkcję GetStudentGradesForCourse znajdującą się w węźle Stored Procedures and Functions i kliknij Finish.

Step 15 - Wybierz View → Other Windows → Entity Data Model Browser i kliknij prawym przyciskiem myszy GetStudentGradesForCourse w sekcji Import funkcji i wybierz Edytuj.

Zobaczysz następujące okno dialogowe.

Step 16 - Kliknij przycisk radiowy Entities i wybierz Enrollment z pola combo jako typ zwrotu tej funkcji i kliknij OK.

Przyjrzyjmy się poniższemu kodowi C #, w którym zostaną pobrane oceny wszystkich uczniów, którzy są zapisani na identyfikator kursu = 4022 w bazie danych.

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         var CourseID = 4022;

         // Return all the best students in the Microeconomics class.
         var students = context.GetStudentGradesForCourse(CourseID);

         foreach (var result in students) {
            Console.WriteLine("Student ID:  {0}, Grade: {1}",
               result.StudentID, result.Grade);
         }

         Console.ReadKey();
      }
   }
}

Kiedy powyższy kod zostanie skompilowany i wykonany, otrzymasz następujący wynik -

Student ID: 1, Grade: 2
Student ID: 4, Grade: 4
Student ID: 9, Grade: 3.5

Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.