資料表值函式 (TVF)

注意

僅限 EF5 及更新版本 - 在 Entity Framework 5 中已介紹此頁面所討論的功能、API 等。 如果您使用的是較早版本,則不適用部分或全部的資訊。

影片和逐步解說示範如何使用 Entity Framework Designer 對應資料表值函式 (TVF)。 它也示範如何從 LINQ 查詢呼叫 TVF。

TVF 目前僅支援 Database First 工作流程。

ENTITY Framework 第 5 版引進 TVF 支援。 請注意,若要使用資料表值函式、列舉和空間類型等新功能,您必須以 .NET Framework 4.5 為目標。 Visual Studio 2012 預設會以 .NET 4.5 為目標。

TVF 與預存程式非常類似,但有一個主要差異:TVF 的結果是可組合的。 這表示 TVF 的結果可以在 LINQ 查詢中使用,而預存程式的結果則無法使用。

觀賞影片

呈現者 :朱麗亞·科尼奇

WMV | MP4 | WMV (ZIP)

必要條件

若要完成本逐步解說,您需要:

設定專案

  1. 開啟 Visual Studio
  2. 在 [ 檔案] 功能表上,指向 [ 新增 ],然後按一下 [ 專案]
  3. 在左窗格中,按一下 [Visual C# ],然後選取 主控台 範本
  4. 輸入 TVF 作為專案的名稱,然後按一下 [ 確定]

將 TVF 新增至資料庫

  • 選取 檢視 - > SQL Server 物件總管
  • 如果 LocalDB 不在伺服器清單中:以滑鼠右鍵按一下 SQL Server,然後選取 [ 新增 SQL Server 使用預設 Windows 驗證 ] 連線到 LocalDB 伺服器
  • 展開 LocalDB 節點
  • 在 [資料庫] 節點下,以滑鼠右鍵按一下 [學校資料庫] 節點,然後選取 [ 新增查詢...
  • 在 T-SQL 編輯器中,貼上下列 TVF 定義
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • 按一下 T-SQL 編輯器上的滑鼠右鍵,然後選取 [ 執行]
  • GetStudentGradesForCourse 函式會新增至 School 資料庫

 

建立模型

  1. 以滑鼠右鍵按一下方案總管中的專案名稱,指向 [ 新增 ],然後按一下 [ 新增專案]
  2. 從左側功能表中選取 [資料],然後在 [範本 ] 窗格中選取 [ADO.NET 實體資料模型 ]
  3. 輸入 TVFModel.edmx 以取得檔案名,然後按一下 [ 新增]
  4. 在 [選擇模型內容] 對話方塊中,選取 [從資料庫 產生],然後按 [ 下一步]
  5. 在 [伺服器名稱] 文字方塊中,按一下 [新增連線ion Enter (localdb)\mssqllocaldb ,以取得資料庫名稱的 [輸入 學校 ],按一下 [ 確定]
  6. 在 [選擇資料庫物件] 對話方塊的 [資料表 ] 節點底下 ,選取 [人員 ]、 [StudentGrade ] 和 [課程 ] 資料表
  7. 選取 [預存程式和函 式] 節點底下的 GetStudentGradesForCourse 函式 注意,從 Visual Studio 2012 開始,實體設計工具可讓您批次匯入預存程式和函式
  8. 按一下 [ 完成]
  9. [實體設計工具] 會顯示為編輯模型提供設計介面。 您在 [ 選擇資料庫物件 ] 對話方塊中選取的所有物件都會新增至模型。
  10. 根據預設,每個匯入預存程式或函式的結果圖形會自動成為實體模型中的新複雜類型。 但是我們想要將 GetStudentGradesForCourse 函式的結果對應至 StudentGrade 實體:以滑鼠右鍵按一下設計介面,然後選取 [模型瀏覽器中的模型瀏覽器 ],選取 [函數匯 入],然後按兩下 GetStudentGradesForCourse 函式在 [編輯函數匯入] 對話方塊中,選取 [實體 ],然後選擇 [StudentGrade]

保存和擷取資料

開啟定義 Main 方法的檔案。 將下列程式碼新增至 Main 函式。

下列程式碼示範如何建置使用資料表值函式的查詢。 查詢會將結果投影成匿名型別,其中包含相關課程標題和成績大於或等於 3.5 的相關學生。

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;

    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };

    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title,  
            result.Person.FirstName,  
            result.Person.LastName);
    }
}

編譯並執行應用程式。 此程式會產生下列輸出:

Couse: Microeconomics, Student: Arturo Anand
Couse: Microeconomics, Student: Carson Bryant

摘要

在本逐步解說中,我們已瞭解如何使用 Entity Framework Designer 對應資料表值函式 (TVF)。 它也示範如何從 LINQ 查詢呼叫 TVF。