实体框架 - 表值函数

在本章中,让我们学习如何使用实体框架设计器映射表值函数 (TVF) 以及如何从 LINQ 查询调用 TVF。

  • TVF 目前仅在数据库优先工作流中受支持。

  • 它首次在实体框架版本 5 中引入。

  • 要使用 TVF,您必须以 .NET Framework 4.5 或更高版本为目标。

  • 它与存储过程非常相似,但有一个关键区别,即 TVF 的结果是可组合的。这意味着 TVF 的结果可用于 LINQ 查询,而存储过程的结果则不能。

让我们看一下以下从文件 → 创建新项目的示例新建 → 项目。

创建项目

步骤 1 − 从中间窗格中选择控制台应用程序,并在名称字段中输入 TableValuedFunctionDemo。

步骤 2 − 在服务器资源管理器中右键单击您的数据库。

Explorer Database

步骤 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 − 右键单击​​编辑器并选择"执行"。

Editor Select

现在您可以看到函数已创建。

函数已创建

步骤 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

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