Entity Framework - ฟังก์ชัน Table-Valued

ในบทนี้ให้เราเรียนรู้วิธีการแมป Table-valueed Functions (TVFs) โดยใช้ Entity Framework Designer และวิธีการเรียก TVF จากแบบสอบถาม LINQ

  • ปัจจุบัน TVF ได้รับการสนับสนุนในเวิร์กโฟลว์ Database First เท่านั้น

  • เปิดตัวครั้งแรกใน Entity Framework เวอร์ชัน 5

  • ในการใช้ TVF คุณต้องกำหนดเป้าหมาย. NET Framework 4.5 ขึ้นไป

  • คล้ายกับขั้นตอนการจัดเก็บมาก แต่มีข้อแตกต่างที่สำคัญอย่างหนึ่งคือผลลัพธ์ของ TVF สามารถประกอบได้ ซึ่งหมายความว่าผลลัพธ์จาก TVF สามารถใช้ในแบบสอบถาม LINQ ได้ในขณะที่ไม่สามารถใช้ผลลัพธ์ของกระบวนงานที่เก็บไว้ได้

มาดูตัวอย่างการสร้างโปรเจ็กต์ใหม่จาก File → New → Project ต่อไปนี้

Step 1 - เลือกแอปพลิเคชันคอนโซลจากบานหน้าต่างตรงกลางและป้อน TableValuedFunctionDemo ในช่องชื่อ

Step 2 - ใน Server explorer คลิกขวาที่ฐานข้อมูลของคุณ

Step 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

Step 4 - คลิกขวาที่ตัวแก้ไขและเลือกดำเนินการ

Step 5- คลิกขวาที่ฐานข้อมูลของคุณแล้วคลิกรีเฟรช คุณจะเห็นตารางที่เพิ่มใหม่ในฐานข้อมูลของคุณ

Step 6- ตอนนี้สร้างฟังก์ชันที่จะคืนเกรดของนักเรียนสำหรับหลักสูตร ป้อนรหัสต่อไปนี้ในตัวแก้ไข T-SQL

CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
   SELECT [EnrollmentID],
      [CourseID],
      [StudentID],
      [Grade]
   FROM   [dbo].[StudentGrade]
   WHERE  CourseID = @CourseID

Step 7 - คลิกขวาที่ตัวแก้ไขและเลือกดำเนินการ

ตอนนี้คุณจะเห็นว่าฟังก์ชันถูกสร้างขึ้น

Step 8 - คลิกขวาที่ชื่อโครงการใน Solution Explorer แล้วเลือกเพิ่ม→รายการใหม่

Step 9 - จากนั้นเลือก ADO.NET Entity Data Model ในบานหน้าต่างเทมเพลต

Step 10 - ป้อน TVFModel เป็นชื่อจากนั้นคลิกเพิ่ม

Step 11 - ในกล่องโต้ตอบเลือกเนื้อหาแบบจำลองให้เลือกตัวออกแบบ EF จากฐานข้อมูลจากนั้นคลิกถัดไป

Step 12 - เลือกฐานข้อมูลของคุณแล้วคลิกถัดไป

Step 13 - ในกล่องโต้ตอบเลือกวัตถุฐานข้อมูลของคุณให้เลือกตารางมุมมอง

Step 14 - เลือกฟังก์ชัน GetStudentGradesForCourse ที่อยู่ภายใต้โหนด Stored Procedures and Functions แล้วคลิก Finish

Step 15 - เลือก View → Other Windows → Entity Data Model Browser แล้วคลิกขวา GetStudentGradesForCourse ภายใต้ Function Imports แล้วเลือก Edit

คุณจะเห็นกล่องโต้ตอบต่อไปนี้

Step 16 - คลิกที่ปุ่มตัวเลือกเอนทิตีและเลือกการลงทะเบียนจากคอมโบบ็อกซ์เป็นประเภทการส่งคืนของฟังก์ชันนี้และคลิกตกลง

มาดูรหัส C # ต่อไปนี้ซึ่งจะมีการดึงคะแนนของนักเรียนทุกคนที่ลงทะเบียนเรียนใน Course 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

เราขอแนะนำให้คุณดำเนินการตามตัวอย่างข้างต้นในลักษณะทีละขั้นตอนเพื่อความเข้าใจที่ดีขึ้น