Учебники

Entity Framework — Табличная функция

В этой главе мы узнаем, как отображать табличные функции (TVF) с помощью Entity Framework Designer и как вызывать TVF из запроса LINQ.

  • TVF в настоящее время поддерживаются только в рабочем процессе Database First.

  • Впервые он был представлен в Entity Framework версии 5.

  • Чтобы использовать TVF, вы должны ориентироваться на .NET Framework 4.5 или выше.

  • Это очень похоже на хранимые процедуры, но с одним ключевым отличием, т. Е. Результат TVF является составным. Это означает, что результаты из TVF могут использоваться в запросе LINQ, а результаты хранимой процедуры — нет.

TVF в настоящее время поддерживаются только в рабочем процессе Database First.

Впервые он был представлен в Entity Framework версии 5.

Чтобы использовать TVF, вы должны ориентироваться на .NET Framework 4.5 или выше.

Это очень похоже на хранимые процедуры, но с одним ключевым отличием, т. Е. Результат TVF является составным. Это означает, что результаты из TVF могут использоваться в запросе LINQ, а результаты хранимой процедуры — нет.

Давайте рассмотрим следующий пример создания нового проекта из File → New → Project.

Создать проект

Шаг 1 — Выберите Консольное приложение из средней панели и введите TableValuedFunctionDemo в поле имени.

Шаг 2 — В обозревателе серверов щелкните правой кнопкой мыши свою базу данных.

База данных Explorer

Шаг 3 — Выберите New Query и введите следующий код в редакторе T-SQL, чтобы добавить новую таблицу в базу данных.

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

Шаг 4 — Щелкните правой кнопкой мыши на редакторе и выберите «Выполнить».

Выберите Выполнить

Шаг 5 — Щелкните правой кнопкой мыши по вашей базе данных и нажмите Обновить. Вы увидите новую добавленную таблицу в вашей базе данных.

Добавленная таблица

Шаг 6 — Теперь создайте функцию, которая будет возвращать оценки студентов за курс. Введите следующий код в редакторе T-SQL.

CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

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

Шаг 7 — Щелкните правой кнопкой мыши на редакторе и выберите «Выполнить».

Выбор редактора

Теперь вы можете видеть, что функция создана.

Функция создана

Шаг 8 — Щелкните правой кнопкой мыши имя проекта в обозревателе решений и выберите Добавить → Новый элемент.

Шаг 9 — Затем выберите ADO.NET Entity Data Model на панели шаблонов.

Панель шаблонов сущностей

Шаг 10 — введите TVFModel в качестве имени и нажмите кнопку «Добавить».

Шаг 11 — В диалоговом окне «Выбор содержимого модели» выберите EF designer из базы данных и нажмите «Далее».

Диалоговое окно контента

Шаг 12 — Выберите вашу базу данных и нажмите Далее.

Выберите базу данных

Шаг 13 — В диалоговом окне «Выбор объектов базы данных» выберите таблицы, представления.

Диалоговое окно объекта

Шаг 14 — Выберите функцию GetStudentGradesForCourse, расположенную в узле «Хранимые процедуры и функции», и нажмите «Готово».

Шаг 15 — Выберите «Вид» → «Другие окна» → «Браузер модели данных объектов» и щелкните правой кнопкой мыши GetStudentGradesForCourse в разделе «Импорт функций» и выберите «Редактировать».

Выберите вид

Вы увидите следующий диалог.

диалог

Шаг 16. Нажмите переключатель «Сущности», выберите «Регистрация» в поле со списком в качестве типа возврата этой функции и нажмите «ОК».

Давайте посмотрим на следующий код C #, в котором будут получены оценки всех учащихся, которые зарегистрированы в базе данных с идентификатором курса = 4022.

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

Когда приведенный выше код скомпилирован и выполнен, вы получите следующий вывод:

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

Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.