實體框架 - 表值函式



在本章中,我們將學習如何使用實體框架設計器對映表值函式 (TVF),以及如何從 LINQ 查詢呼叫 TVF。

  • TVF 目前僅在資料庫優先工作流中受支援。

  • 它首次在實體框架版本 5 中引入。

  • 要使用 TVF,您必須面向 .NET Framework 4.5 或更高版本。

  • 它與儲存過程非常相似,但有一個關鍵區別,即 TVF 的結果是可組合的。這意味著 TVF 的結果可以在 LINQ 查詢中使用,而儲存過程的結果則不能。

讓我們來看一下從“檔案”→“新建”→“專案”建立新專案的示例。

Create Project

步驟 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 - 右鍵單擊編輯器並選擇“執行”。

Select Execute

步驟 5 - 右鍵單擊您的資料庫並單擊“重新整理”。您將在資料庫中看到新新增的表。

Added Table

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

現在您可以看到該函式已建立。

Function Created

步驟 8 - 右鍵單擊解決方案資源管理器中的專案名稱,然後選擇“新增”→“新建項”。

步驟 9 - 然後在“模板”窗格中選擇“ADO.NET 實體資料模型”。

Entity Template Pane

步驟 10 - 輸入 TVFModel 作為名稱,然後單擊“新增”。

步驟 11 - 在“選擇模型內容”對話方塊中,選擇“從資料庫中選擇 EF 設計器”,然後單擊“下一步”。

Content Dialog Box

步驟 12 - 選擇您的資料庫並單擊“下一步”。

Select Database

步驟 13 - 在“選擇資料庫物件”對話方塊中,選擇表、檢視。

Object Dialog Box

步驟 14 - 選擇位於“儲存過程和函式”節點下的 GetStudentGradesForCourse 函式,然後單擊“完成”。

步驟 15 - 選擇“檢視”→“其他視窗”→“實體資料模型瀏覽器”,右鍵單擊“函式匯入”下的 GetStudentGradesForCourse,然後選擇“編輯”。

Select View

您將看到以下對話方塊。

Dialog

步驟 16 - 單擊“實體”單選按鈕,從組合框中選擇 Enrollment 作為此函式的返回型別,然後單擊“確定”。

讓我們來看一下下面的 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

我們建議您逐步執行上述示例,以便更好地理解。

廣告