Fungsi Database
Fungsi database setara dengan metode C#. Fungsi database dapat dipanggil dengan parameter nol atau lebih dan menghitung hasil berdasarkan nilai parameter. Sebagian besar database, yang menggunakan SQL untuk kueri memiliki dukungan untuk fungsi database. Jadi SQL yang dihasilkan oleh terjemahan kueri EF Core juga memungkinkan pemanggilan fungsi database. Metode C# tidak perlu diterjemahkan secara ketat ke fungsi database di EF Core.
- Metode C# mungkin tidak memiliki fungsi database yang setara.
- String.IsNullOrEmpty metode diterjemahkan ke pemeriksaan null dan perbandingan dengan string kosong dalam database daripada fungsi.
- String.Equals(String, StringComparison) metode tidak memiliki database yang setara karena perbandingan string tidak dapat diwakili atau dimigrasikan dengan mudah dalam database.
- Fungsi database mungkin tidak memiliki metode C# yang setara. Operator
??
di C#, yang tidak memiliki metode apa pun, diterjemahkan keCOALESCE
fungsi dalam database.
Jenis fungsi database
Pembuatan EF Core SQL mendukung subset fungsi yang dapat digunakan dalam database. Batasan ini berasal dari kemampuan untuk mewakili kueri di LINQ untuk fungsi database yang diberikan. Selanjutnya, setiap database memiliki berbagai dukungan fungsi database, sehingga EF Core menyediakan subset umum. Penyedia database gratis untuk memperluas pembuatan EF Core SQL untuk mendukung lebih banyak pola. Berikut ini adalah jenis fungsi database yang didukung EF Core dan diidentifikasi secara unik. Istilah-istilah ini juga membantu dalam memahami terjemahan apa yang dibangun dengan penyedia EF Core.
Fungsi bawaan vs yang ditentukan pengguna
Fungsi bawaan dilengkapi dengan database yang telah ditentukan sebelumnya, tetapi fungsi yang ditentukan pengguna secara eksplisit ditentukan oleh pengguna dalam database. Ketika EF Core menerjemahkan kueri untuk menggunakan fungsi database, EF Core menggunakan fungsi bawaan untuk memastikan bahwa fungsi selalu tersedia di database. Perbedaan fungsi bawaan diperlukan dalam beberapa database untuk menghasilkan SQL dengan benar. Misalnya SqlServer mengharuskan setiap fungsi yang ditentukan pengguna dipanggil dengan nama yang memenuhi syarat skema. Tetapi fungsi bawaan di SqlServer tidak memiliki skema. PostgreSQL mendefinisikan fungsi bawaan dalam public
skema tetapi dapat dipanggil dengan nama yang memenuhi syarat skema.
Fungsi agregat vs skalar vs bernilai tabel
- Fungsi skalar mengambil nilai skalar - seperti bilangan bulat atau string - sebagai parameter dan mengembalikan nilai skalar sebagai hasilnya. Fungsi skalar dapat digunakan di mana saja di SQL di mana nilai skalar dapat diteruskan.
- Fungsi agregat mengambil aliran nilai skalar sebagai parameter dan mengembalikan nilai skalar sebagai hasilnya. Fungsi agregat diterapkan pada seluruh tataan hasil kueri atau pada sekelompok nilai yang dihasilkan dengan menerapkan
GROUP BY
operator. - Fungsi bernilai tabel mengambil nilai skalar sebagai parameter dan mengembalikan aliran baris sebagai hasilnya. Fungsi bernilai tabel digunakan sebagai sumber tabel dalam
FROM
klausa.
Fungsi Niladik
Fungsi Niladik adalah fungsi database khusus yang tidak memiliki parameter apa pun dan harus dipanggil tanpa tanda kurung. Mereka mirip dengan akses properti/bidang pada instans di C#. Fungsi Niladic berbeda dari fungsi tanpa parameter karena yang terakhir memerlukan tanda kurung kosong. Tidak ada nama khusus untuk fungsi database yang selalu memerlukan tanda kurung. Subset lain dari fungsi database berdasarkan jumlah parameter adalah fungsi variadik. Fungsi variadik dapat mengambil berbagai jumlah parameter saat dipanggil.
Pemetaan fungsi database di EF Core
EF Core mendukung tiga cara pemetaan yang berbeda antara fungsi C# dan fungsi database.
Pemetaan fungsi bawaan
Secara default, penyedia EF Core menyediakan pemetaan untuk berbagai fungsi bawaan melalui jenis primitif. Misalnya, String.ToLower() diterjemahkan ke LOWER
dalam SqlServer. Fungsionalitas ini memungkinkan pengguna menulis kueri di LINQ dengan mulus. Kami biasanya memberikan terjemahan dalam database yang memberikan hasil yang sama dengan apa yang disediakan fungsi C# di sisi klien. Terkadang, untuk mencapai itu, terjemahan aktual bisa menjadi sesuatu yang lebih rumit daripada fungsi database. Dalam beberapa skenario, kami juga memberikan terjemahan yang paling tepat daripada mencocokkan semantik C#. Fitur yang sama juga digunakan untuk memberikan terjemahan umum untuk beberapa akses anggota C#. Misalnya, String.Length diterjemahkan ke LEN
dalam SqlServer. Selain penyedia, penulis plugin juga dapat menambahkan terjemahan tambahan. Ekstensibilitas ini berguna ketika plugin menambahkan dukungan untuk lebih banyak jenis sebagai jenis primitif dan ingin menerjemahkan metode di atasnya.
EF. Pemetaan fungsi
Karena tidak semua fungsi database memiliki fungsi C# yang setara, penyedia EF Core memiliki metode C# khusus untuk memanggil fungsi database tertentu. Metode ini didefinisikan sebagai metode ekstensi yang EF.Functions
akan digunakan dalam kueri LINQ. Metode ini khusus untuk penyedia karena terkait erat dengan fungsi database tertentu. Jadi metode yang berfungsi untuk satu penyedia kemungkinan tidak akan berfungsi untuk penyedia lain. Selanjutnya, karena niat metode ini adalah untuk memanggil fungsi database dalam kueri yang diterjemahkan, mencoba mengevaluasinya pada klien menghasilkan pengecualian.
Pemetaan fungsi yang ditentukan pengguna
Selain pemetaan yang disediakan oleh penyedia EF Core, pengguna juga dapat menentukan pemetaan kustom. Pemetaan yang ditentukan pengguna memperluas terjemahan kueri sesuai dengan kebutuhan pengguna. Fungsionalitas ini berguna ketika ada fungsi yang ditentukan pengguna dalam database, yang ingin dipanggil pengguna dari kueri LINQ mereka.