表值函数 (TVF)
注意
仅限 EF5 及更高版本 - 此页面中讨论的功能、API 等已引入实体框架 5。 如果使用的是早期版本,则部分或全部信息不适用。
分步式的视频演练介绍如何使用 Entity Framework Designer 映射表值函数 (TVF)。 其中还演示了如何从 LINQ 查询调用 TVF。
目前仅 Database First 工作流支持 TVF。
Entity Framework 版本 5 中引入了 TVF 支持。 请注意,若要使用表值函数、枚举和空间类型等新功能,必须面向 .NET Framework 4.5。 Visual Studio 2012 默认面向 .NET 4.5。
TVF 与存储过程非常相似,但有一个关键区别:TVF 的结果是可组合的。 这意味着 TVF 的结果可用于 LINQ 查询,存储过程的结果则不能。
观看视频
主讲人:Julia Kornich
先决条件
若要完成本演练,你需要:
安装 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”作为文件名,然后单击“添加”
- 在“选择模型内容”对话框中,选择“从数据库生成”,然后单击“下一步”
- 单击“新建连接” 在服务器名称文本框中输入 (localdb)\mssqllocaldb 输入 School 作为数据库名称 单击“确定”
- 在“选择数据库对象”对话框中的“表”节点下,选择“人员”、“StudentGrade”和“Course”表
- 选择位于“存储过程和函数”节点下的 GetStudentGradesForCourse 函数 注意,从 Visual Studio 2012 开始,Entity Designer 可以批量导入存储过程和函数
- 单击“完成”
- 将显示 Entity Designer,它提供用于编辑模型的设计图面。 在“选择数据库对象”对话框中选择的所有对象都已经添加到模型中。
- 默认情况下,每个导入存储过程或函数的结果形状将自动成为实体模型中的新复杂类型。 但我们要将 GetStudentGradesForCourse 函数的结果映射到 StudentGrade 实体: 右键单击设计图面并选择“模型浏览器” 在模型浏览器中,选择“函数导入”,然后双击 GetStudentGradesForCourse 函数 在“编辑函数导入”对话框中,选择“实体”并选择“StudentGrade”
保留和检索数据
打开该文件,其中定义了 Main 方法。 将以下代码添加到 Main 函数中。
以下代码演示如何构建使用表值函数的查询。 该查询将结果投射到一个匿名类型中,该类型包含相关的 Course 标题和分数大于或等于 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
总结
在本演练中,我们了解了如何使用 Entity Framework Designer 映射表值函数 (TVF)。 其中还演示了如何从 LINQ 查询调用 TVF。