开发手册 欢迎您!
软件开发者资料库

Entity Framework - 表值函数

Entity Framework表值函数 - 从概述,体系结构,环境设置,数据库设置,数据模型,DbContext,类型,关系,生命周期,代码优先方法,模型优先方法,数据库优先方法,DEV方法,数据库操作开始学习实体框架,并发,事务,视图,索引,存储过程,断开连接的实体,表值函数,本机SQL,枚举支持,异步查询,持久性,投影查询,命令记录,命令拦截,空间数据类型,继承,迁移,渴望,延迟,显式加载,验证,跟踪更改,彩色实体,第一个示例,数据注释,Fluent API,种子数据库,代码优先迁移,多个DbContext,嵌套实体类型。

在本章中,让我们学习如何使用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.

Select Database

第13步 : 在"选择数据库对象"对话框中,选择表格,视图.

对话框

步骤14 : 选择存储过程和函数节点下的GetStudentGradesForCourse函数,然后单击Finish.

步骤15 : 选择View→Other Windows→Entity Data Model Browser,右键单击Function Imports下的GetStudentGradesForCourse,然后选择Edit.

选择查看

您将看到以下对话框.

Dialog

第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


我们建议您逐步执行上述示例,以便更好地理解.