📅  最后修改于: 2020-11-21 07:22:54             🧑  作者: Mango
在本章中,让我们学习如何使用Entity Framework Designer映射表值函数(TVF),以及如何从LINQ查询中调用TVF。
当前仅在数据库优先工作流程中支持TVF。
它是在Entity Framework版本5中首次引入的。
要使用TVF,您必须以.NET Framework 4.5或更高版本为目标。
它与存储过程非常相似,但有一个关键的区别,即TVF的结果是可组合的。这意味着TVF的结果可以在LINQ查询中使用,而存储过程的结果则不能。
让我们看一下下面的示例,该示例从File→New→Project创建一个新项目。
步骤1-从中间窗格中选择控制台应用程序,然后在名称字段中输入TableValuedFunctionDemo。
步骤2-在服务器资源管理器中,右键单击数据库。
步骤3-选择“新建查询”,然后在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-选择视图→其他Windows→实体数据模型浏览器,然后在函数导入下右键单击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
我们建议您逐步执行上述示例,以更好地理解。