Bagikan melalui


Kueri SQL Mentah (EF6)

Entity Framework memungkinkan Anda untuk mengkueri menggunakan LINQ dengan kelas entitas Anda. Namun, mungkin ada kalanya Anda ingin menjalankan kueri menggunakan SQL mentah langsung terhadap database. Ini termasuk memanggil prosedur tersimpan, yang dapat membantu model Code First yang saat ini tidak mendukung pemetaan ke prosedur tersimpan. Teknik yang ditunjukkan dalam topik ini berlaku sama untuk model yang dibuat dengan Perancang EF dan Code First.

Menulis kueri SQL untuk entitas

Metode SqlQuery pada DbSet memungkinkan kueri SQL mentah ditulis yang akan mengembalikan instans entitas. Objek yang dikembalikan akan dilacak oleh konteks seperti halnya jika dikembalikan oleh kueri LINQ. Contohnya:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}

Perhatikan bahwa, sama seperti untuk kueri LINQ, kueri tidak dijalankan sampai hasil dijumlahkan—dalam contoh di atas ini dilakukan dengan panggilan ke ToList.

Perawatan harus diambil setiap kali kueri SQL mentah ditulis karena dua alasan. Pertama, kueri harus ditulis untuk memastikan bahwa kueri hanya mengembalikan entitas yang benar-benar dari jenis yang diminta. Misalnya, saat menggunakan fitur seperti pewarisan, mudah untuk menulis kueri yang akan membuat entitas yang merupakan jenis CLR yang salah.

Kedua, beberapa jenis kueri SQL mentah mengekspos potensi risiko keamanan, terutama di sekitar serangan injeksi SQL. Pastikan Anda menggunakan parameter dalam kueri Anda dengan cara yang benar untuk melindungi dari serangan tersebut.

Memuat entitas dari prosedur tersimpan

Anda dapat menggunakan DbSet.SqlQuery untuk memuat entitas dari hasil prosedur tersimpan. Misalnya, kode berikut memanggil dbo. Prosedur GetBlogs dalam database:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}

Anda juga dapat meneruskan parameter ke prosedur tersimpan menggunakan sintaks berikut:

using (var context = new BloggingContext())
{
    var blogId = 1;

    var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}

Menulis kueri SQL untuk jenis non-entitas

Kueri SQL yang mengembalikan instans dari jenis apa pun, termasuk jenis primitif, dapat dibuat menggunakan metode SqlQuery pada kelas Database. Contohnya:

using (var context = new BloggingContext())
{
    var blogNames = context.Database.SqlQuery<string>(
                       "SELECT Name FROM dbo.Blogs").ToList();
}

Hasil yang dikembalikan dari SqlQuery di Database tidak akan pernah dilacak oleh konteks bahkan jika objek adalah instans dari jenis entitas.

Mengirim perintah mentah ke database

Perintah non-kueri dapat dikirim ke database menggunakan metode ExecuteSqlCommand di Database. Contohnya:

using (var context = new BloggingContext())
{
    context.Database.ExecuteSqlCommand(
        "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}

Perhatikan bahwa setiap perubahan yang dilakukan pada data dalam database menggunakan ExecuteSqlCommand buram terhadap konteks hingga entitas dimuat atau dimuat ulang dari database.

Parameter Output

Jika parameter output digunakan, nilainya tidak akan tersedia sampai hasilnya telah dibaca sepenuhnya. Hal ini disebabkan oleh perilaku DbDataReader yang mendasar, lihat Mengambil Data Menggunakan DataReader untuk detail selengkapnya.