Bagikan melalui


Cara: Memanggil Fungsi Database Kustom

Topik ini menjelaskan cara memanggil fungsi kustom yang ditentukan dalam database dari dalam kueri LINQ ke Entitas.

Fungsi basis data yang dipanggil dari kueri LINQ ke Entitas dijalankan dalam database. Menjalankan fungsi dalam database dapat meningkatkan kinerja aplikasi.

Prosedur di bawah ini memberikan garis besar tingkat tinggi untuk memanggil fungsi database kustom. Contoh berikut memberikan detail lebih lanjut tentang langkah-langkah dalam prosedur.

Untuk memanggil fungsi khusus yang ditentukan dalam database

  1. Buat fungsi kustom di database Anda.

    Untuk informasi selengkapnya tentang membuat fungsi khusus di SQL Server, lihat BUAT FUNGSI (Transact-SQL).

  2. Nyatakan fungsi dalam bahasa definisi skema toko (SSDL) dari file .edmx Anda. Nama fungsi harus sama dengan nama fungsi yang dinyatakan dalam database.

    Untuk informasi selengkapnya, lihat Elemen Fungsi (SSDL).

  3. Tambahkan metode yang sesuai ke kelas dalam kode aplikasi Anda dan terapkan EdmFunctionAttribute ke metode Perhatikan bahwa parameter NamespaceName dan FunctionName dari atribut adalah nama namespace model konseptual dan nama fungsi dalam model konseptual masing-masing. Resolusi nama fungsi untuk LINQ peka huruf besar/kecil.

  4. Panggil metode dalam kueri LINQ ke Entitas.

Contoh 1

Contoh berikut menunjukkan cara memanggil fungsi database kustom dari dalam kueri LINQ ke Entitas. Contoh menggunakan model Sekolah. Untuk informasi tentang model Sekolah, lihat Membuat Database Sampel Sekolah dan Membuat File .edmx Sekolah.

Kode berikut menambahkan fungsi AvgStudentGrade ke database sampel Sekolah.

Catatan

Langkah-langkah untuk memanggil fungsi database kustom adalah sama terlepas dari server database. Namun, kode di bawah ini khusus untuk membuat fungsi dalam database SQL Server. Kode untuk membuat fungsi kustom di server database lain mungkin berbeda.

USE [School]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[AvgStudentGrade](@studentId INT)
RETURNS DECIMAL(3,2)
AS
    BEGIN
    DECLARE @avg DECIMAL(3,2);
    SELECT @avg = avg(Grade) FROM StudentGrade WHERE StudentID = @studentId;

    RETURN @avg;
END

Contoh 2

Selanjutnya, nyatakan fungsi dalam bahasa definisi skema toko (SSDL) dari file .edmx Anda. Kode berikut menyatakan fungsi AvgStudentGrade di SSDL:

<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
  <Parameter Name="studentId" Mode="In" Type="int" />
</Function>

Contoh 3

Sekarang, buat metode dan petakan ke fungsi yang dinyatakan di SSDL. Metode di kelas berikut dipetakan ke fungsi yang ditentukan dalam SSDL (di atas) dengan menggunakan EdmFunctionAttribute. Ketika metode ini dipanggil, fungsi yang sesuai dalam database dijalankan.

[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel.Store", "AvgStudentGrade")>
Public Function AvgStudentGrade(ByVal studentId As Integer) _
    As Nullable(Of Decimal)
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Contoh 4

Terakhir, panggil metode dalam kueri LINQ ke Entitas. Kode berikut menampilkan nama belakang siswa dan nilai rata-rata ke konsol:

using (SchoolEntities context = new SchoolEntities())
{
    var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };

    foreach (var student in students)
    {
        Console.WriteLine("{0}: {1}", student.name, student.avgGrade);
    }
}
Using context As New SchoolEntities()
    Dim students = From s In context.People _
                   Where s.EnrollmentDate IsNot Nothing _
                   Select New With {.name = s.LastName, _
                                   .avgGrade = AvgStudentGrade(s.PersonID)}

    For Each student In students
        Console.WriteLine("{0}: {1}", _
                            student.name, _
                            student.avgGrade)
    Next
End Using

Lihat juga