表值函数(Tvf)Table-Valued Functions (TVFs)
备注
EF5 仅向前-实体框架5中引入了本页中所述的功能、api 等。 如果使用的是早期版本,则部分或全部信息不适用。
视频和分步演练演示了如何使用 Entity Framework Designer 映射表值函数(Tvf)。 它还演示了如何从 LINQ 查询调用 TVF。
Tvf 当前仅在 Database First 工作流中受支持。
实体框架版本5中引入了 TVF 支持。 请注意,若要使用表值函数、枚举和空间类型等新功能,则必须以 .NET Framework 4.5 为目标。 默认情况下,Visual Studio 2012 面向 .NET 4.5。
Tvf 非常类似于具有一个关键区别的存储过程: TVF 的结果是可组合的。 这意味着,可以在 LINQ 查询中使用 TVF 的结果,而存储过程的结果不能。
观看视频Watch the video
主讲人:Julia Kornich
先决条件Pre-Requisites
若要完成本演练,你需要:
安装School 数据库。
具有最新版本的 Visual Studio
设置项目Set up the Project
- 打开 Visual Studio
- 在 “文件“ 菜单上,指向 “新建“,然后单击 “项目“
- 在左窗格中,单击 “ Visual C# “,然后选择控制台模板
- 输入TVF作为项目名称,然后单击 “确定”
将 TVF 添加到数据库Add a TVF to the Database
- 选择 “ > 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 数据库
创建模型Create a Model
- 右键单击 “解决方案资源管理器中的项目名称,指向”添加“,然后单击”新建项“
- 从左侧菜单中选择 “数据“,然后在 “模板“ 窗格中选择 “ ADO.NET 实体数据模型
- 输入TVFModel作为文件名,然后单击 “添加“
- 在 “选择模型内容” 对话框中,选择 “ 从数据库生成“,然后单击 “ 下一步“
- 单击 “ 新建连接输入 (localdb)\Mssqllocaldb在” 服务器名称 “文本框中输入School 数据库名称单击 “ 确定 “
- 在 “选择数据库对象” 对话框中,在 “ 表 “ 节点下,选择 “ Person“、” StudentGrade“ 和 “ 课程“ 表
- 从 Visual Studio 2012 开始,选择 “ 存储过程” 和 “函数 “ 节点下的 GetStudentGradesForCourse函数,该函数从 Visual Studio 开始,Entity Designer 允许批处理导入存储过程和函数
- 单击 “ 完成“
- 此时会显示 Entity Designer,它提供了用于编辑模型的设计图面。 您在 “ 选择数据库对象 “ 对话框中选择的所有对象都将添加到模型中。
- 默认情况下,每个导入的存储过程或函数的结果形状将自动成为实体模型中的新复杂类型。 但我们想要将 GetStudentGradesForCourse 函数的结果映射到 StudentGrade 实体:右键单击设计图面,然后在 “模型浏览器” 中选择 “ 模型浏览器“,选择 “ 函数导入”,然后在 “编辑函数导入” 对话框中双击 “ GetStudentGradesForCourse “ 函数,选择 “ 实体“ 并选择 StudentGrade
保留和检索数据Persist and Retrieve Data
打开定义 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
SummarySummary
在本演练中,我们介绍了如何使用 Entity Framework Designer 映射表值函数(Tvf)。 它还演示了如何从 LINQ 查询调用 TVF。