实体框架 – 表值函数
实体框架 – 表值函数
在本章中,让我们学习如何使用实体框架设计器映射表值函数 (TVF) 以及如何从 LINQ 查询调用 TVF。
-
TVF 目前仅在 Database First 工作流中受支持。
-
它首先在实体框架版本 5 中引入。
-
要使用 TVF,您必须面向 .NET Framework 4.5 或更高版本。
-
它与存储过程非常相似,但有一个关键区别,即 TVF 的结果是可组合的。这意味着 TVF 的结果可用于 LINQ 查询,而存储过程的结果则不能。
让我们看看以下从 File → New → Project 创建新项目的示例。

步骤 1 – 从中间窗格中选择控制台应用程序,然后在名称字段中输入 TableValuedFunctionDemo。
步骤 2 – 在服务器资源管理器中右键单击您的数据库。

Step 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 实体数据模型。

步骤 10 – 输入 TVFModel 作为名称,然后单击添加。
步骤 11 – 在选择模型内容对话框中,从数据库中选择 EF 设计器,然后单击下一步。

步骤 12 – 选择您的数据库,然后单击下一步。

步骤 13 – 在“选择您的数据库对象”对话框中选择表、视图。

步骤 14 – 选择位于存储过程和函数节点下的 GetStudentGradesForCourse 函数,然后单击完成。
步骤 15 – 选择视图 → 其他窗口 → 实体数据模型浏览器,然后右键单击函数导入下的 GetStudentGradesForCourse 并选择编辑。

您将看到以下对话框。

步骤 16 – 单击实体单选按钮并从组合框中选择注册作为此函数的返回类型,然后单击确定。
让我们看一下以下 C# 代码,其中将检索数据库中课程 ID = 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
我们建议您逐步执行上述示例,以便更好地理解。