Поделиться через


Функции с табличным значением (TVFs)

Примечание.

Ef5 Onwards Only — функции, API и т. д., рассмотренные на этой странице, были представлены в Entity Framework 5. При использовании более ранней версии могут быть неприменимы некоторые или все сведения.

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

В настоящее время TVFs поддерживаются только в рабочем процессе базы данных First.

Поддержка TVF появилась в Entity Framework версии 5. Обратите внимание, что для использования новых функций, таких как функции с табличным значением, перечисления и пространственные типы, необходимо использовать платформа .NET Framework 4.5. Visual Studio 2012 предназначен для .NET 4.5 по умолчанию.

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

Просмотреть видео

Представлено: Джулия Корнич

WMV MP4 | WMV | (ZIP)

Предварительные требования

Чтобы выполнить это пошаговое руководство, необходимо выполнить следующие действия.

Настройка проекта

  1. Запустите Visual Studio
  2. В меню "Файл" наведите указатель мыши на "Создать", а затем щелкните "Проект"
  3. В левой области щелкните Visual C#, а затем выберите шаблон консоли
  4. Введите TVF в качестве имени проекта и нажмите кнопку "ОК"

Добавление TVF в базу данных

  • Выбор представления —> SQL Server обозреватель объектов
  • Если LocalDB отсутствует в списке серверов: щелкните правой кнопкой мыши SQL Server и выберите "Добавить SQL Server" Использовать проверку подлинности Windows по умолчанию для подключения к серверу LocalDB
  • Разверните узел LocalDB
  • В узле "Базы данных" щелкните правой кнопкой мыши узел базы данных School и выберите новый запрос...
  • В редакторе T-SQL вставьте следующее определение TVF
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • Нажмите правую кнопку мыши в редакторе T-SQL и нажмите кнопку "Выполнить".
  • Функция GetStudentGradesForCourse добавляется в базу данных School

 

Создание модели

  1. Щелкните правой кнопкой мыши имя проекта в Обозреватель решений, выберите пункт "Добавить" и выберите пункт "Создать элемент"
  2. Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области "Шаблоны "
  3. Введите TVFModel.edmx для имени файла и нажмите кнопку "Добавить".
  4. В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее"
  5. Нажмите кнопку New Подключение ion Ввод (localdb)\mssqllocaldb в текстовом поле "Ввод школы сервера" для имени базы данных нажмите кнопку "ОК"
  6. В диалоговом окне "Выбор объектов базы данных" в узле "Таблицы " выберите "Person", "StudentGrade" и "Курс "
  7. Выберите функцию GetStudentGradesForCourse, расположенную в узле "Хранимые процедуры и функции", что начиная с Visual Studio 2012 конструктор сущностей позволяет пакетно импортировать хранимые процедуры и функции.
  8. Нажмите кнопку Готово.
  9. Отображается конструктор сущностей, предоставляющий область конструктора для редактирования модели. Все объекты, выбранные в диалоговом окне "Выбор объектов базы данных", добавляются в модель.
  10. По умолчанию результаты каждой импортированной хранимой процедуры или функции автоматически становятся новым сложным типом в модели сущности. Но мы хотим сопоставить результаты функции GetStudentGradesForCourse с сущностью StudentGrade: щелкните правой кнопкой мыши область конструктора и выберите браузер модели в браузере модели, выберите "Импорт функций", а затем дважды щелкните функцию GetStudentGradesForCourse в диалоговом окне "Изменить функцию импорта функций", выберите "Сущности" и выберите "StudentGrade"

Сохранение и извлечение данных

Откройте файл, в котором определен метод Main. Добавьте следующий код в функцию Main.

В следующем коде показано, как создать запрос, использующий функцию с табличным значением. Запрос проектирует результаты в анонимный тип, содержащий связанный заголовок курса и связанных учащихся с более большим или равным 3,5.

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

Скомпилируйте и запустите приложение. Программа выдает следующие результаты.

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

Итоги

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