Bagikan melalui


Cara Kerja Kueri

Entity Framework Core menggunakan Language Integrated Query (LINQ) untuk mengkueri data dari database. LINQ memungkinkan Anda menggunakan C# (atau bahasa pilihan .NET Anda) untuk menulis kueri yang sangat diketik berdasarkan kelas konteks dan entitas turunan Anda.

Catatan

Artikel ini sudah kedaluarsa dan beberapa bagiannya perlu diperbarui untuk memperhitungkan perubahan yang terjadi dalam desain alur kueri. Jika Anda memiliki keraguan tentang perilaku apa pun yang disebutkan di sini, silakan ajukan pertanyaan.

Masa pakai kueri

Deskripsi berikut adalah gambaran umum tingkat tinggi dari proses yang dilalui setiap kueri.

  1. Kueri LINQ diproses oleh Entity Framework Core untuk membangun representasi yang siap diproses oleh penyedia database
    1. Hasilnya di-cache sehingga pemrosesan ini tidak perlu dilakukan setiap kali kueri dijalankan
  2. Hasilnya diteruskan ke penyedia database
    1. Penyedia database mengidentifikasi bagian kueri mana yang dapat dievaluasi dalam database
    2. Bagian kueri ini diterjemahkan ke bahasa kueri khusus database (misalnya, SQL untuk database relasional)
    3. Kueri dikirim ke database dan kumpulan hasil yang dikembalikan (hasilnya adalah nilai dari database, bukan instans entitas)
  3. Untuk setiap item dalam tataan hasil
    1. Jika kueri adalah kueri pelacakan, EF memeriksa apakah data mewakili entitas yang sudah ada di pelacak perubahan untuk instans konteks
      • Jika demikian, entitas yang ada dikembalikan
      • Jika tidak, entitas baru dibuat, pelacakan perubahan disiapkan, dan entitas baru dikembalikan
    2. Jika kueri adalah kueri tanpa pelacakan, entitas baru selalu dibuat dan dikembalikan

Saat kueri dijalankan

Saat memanggil operator LINQ, Anda hanya membangun representasi dalam memori kueri. Kueri hanya dikirim ke database saat hasilnya digunakan.

Operasi paling umum yang mengakibatkan kueri dikirim ke database adalah:

  • Iterasi hasil dalam perulangan for
  • Menggunakan operator seperti ToList, , ToArraySingle, Count, atau kelebihan asinkron yang setara

Peringatan

Selalu validasi input pengguna: Meskipun EF Core melindungi dari serangan injeksi SQL dengan menggunakan parameter dan melarikan diri literal dalam kueri, itu tidak memvalidasi input. Validasi yang sesuai, sesuai persyaratan aplikasi, harus dilakukan sebelum nilai dari sumber yang tidak tepercaya digunakan dalam kueri LINQ, ditetapkan ke properti entitas, atau diteruskan ke API EF Core lainnya. Ini termasuk input pengguna apa pun yang digunakan untuk membangun kueri secara dinamis. Bahkan saat menggunakan LINQ, jika Anda menerima input pengguna untuk membangun ekspresi, Anda perlu memastikan bahwa hanya ekspresi yang dimaksudkan yang dapat dibangun.