Функции с табличным значением (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, а результаты хранимой процедуры невозможно.
Просмотреть видео
Представлено: Джулия Корнич
Предварительные требования
Чтобы выполнить это пошаговое руководство, необходимо выполнить следующие действия.
Установите базу данных School.
У вас есть последняя версия Visual Studio
Настройка проекта
- Запустите Visual Studio
- В меню "Файл" наведите указатель мыши на "Создать", а затем щелкните "Проект"
- В левой области щелкните Visual C#, а затем выберите шаблон консоли
- Введите 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
Создание модели
- Щелкните правой кнопкой мыши имя проекта в Обозреватель решений, выберите пункт "Добавить" и выберите пункт "Создать элемент"
- Выберите данные из меню слева и выберите ADO.NET модель данных сущности в области "Шаблоны "
- Введите TVFModel.edmx для имени файла и нажмите кнопку "Добавить".
- В диалоговом окне "Выбор содержимого модели" выберите "Создать из базы данных" и нажмите кнопку "Далее"
- Нажмите кнопку New Подключение ion Ввод (localdb)\mssqllocaldb в текстовом поле "Ввод школы сервера" для имени базы данных нажмите кнопку "ОК"
- В диалоговом окне "Выбор объектов базы данных" в узле "Таблицы " выберите "Person", "StudentGrade" и "Курс "
- Выберите функцию GetStudentGradesForCourse, расположенную в узле "Хранимые процедуры и функции", что начиная с Visual Studio 2012 конструктор сущностей позволяет пакетно импортировать хранимые процедуры и функции.
- Нажмите кнопку Готово.
- Отображается конструктор сущностей, предоставляющий область конструктора для редактирования модели. Все объекты, выбранные в диалоговом окне "Выбор объектов базы данных", добавляются в модель.
- По умолчанию результаты каждой импортированной хранимой процедуры или функции автоматически становятся новым сложным типом в модели сущности. Но мы хотим сопоставить результаты функции 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.