在本章中,让我们学习如何使用Entity Framework Designer映射表值函数(TVF)以及如何从LINQ查询调用TVF.
TVF目前仅在Database First工作流程中受支持.
它最初是在Entity Framework第5版中引入的.
要使用TVF,您必须以.NET Framework 4.5或更高版本为目标.
它与存储过程非常相似,但有一个关键区别,即TVF的结果是可组合的.这意味着TVF的结果可以在LINQ查询中使用,而存储过程的结果则不能.
让我们来看看在以下从文件→新建→项目创建新项目的示例中.
第1步 : 从中间窗格中选择控制台应用程序,然后在名称字段中输入TableValuedFunctionDemo.
步骤2 : 在服务器资源管理器中右键单击您的数据库.
第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]ENDGO
第4步 : 右键单击编辑器并选择执行.
第5步 : 右键单击数据库,然后单击"刷新".您将在数据库中看到新添加的表.
第6步 : 现在创建一个将返回学生成绩的函数.在T-SQL编辑器中输入以下代码.
CREATE FUNCTION [dbo].[GetStudentGradesForCourse](@CourseID INT)RETURNS TABLERETURN SELECT [EnrollmentID], [CourseID], [StudentID], [Grade] FROM [dbo].[StudentGrade] WHERE CourseID = @CourseID
第7步 : 右键单击编辑器并选择执行.
现在您可以看到该函数已创建.
第8步 : 在Solution Explorer中右键单击项目名称,然后选择Add → 新项目.
第9步 : 然后在"模板"窗格中选择"ADO.NET实体数据模型".
步骤10 : 输入TVFModel作为名称,然后单击"添加".
步骤11 : 在"选择模型内容"对话框中,从"数据库"中选择"EF designer",然后单击"下一步".
第12步 : 选择你的数据库并单击Next.
第13步 : 在"选择数据库对象"对话框中,选择表格,视图.
步骤14 : 选择存储过程和函数节点下的GetStudentGradesForCourse函数,然后单击Finish.
步骤15 : 选择View→Other Windows→Entity Data Model Browser,右键单击Function Imports下的GetStudentGradesForCourse,然后选择Edit.
您将看到以下对话框.
第16步 : 单击Entities单选按钮并从组合框中选择Enrollment作为此Function的返回类型,然后单击Ok.
让我们看看下面的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: 2Student ID: 4, Grade: 4Student ID: 9, Grade: 3.5
我们建议您逐步执行上述示例,以便更好地理解.