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