Apa cara terbaik untuk menulis kueri dengan klausa IN menggunakan Dapper ORM ketika daftar nilai untuk klausa IN berasal dari logika bisnis? Misalnya katakanlah saya punya pertanyaan:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Itu commaSeparatedListOfIDs
sedang diteruskan dari logika bisnis dan itu bisa berupa apa saja IEnumerable(of Integer)
. Bagaimana cara membuat kueri dalam kasus ini? Apakah saya harus melakukan apa yang telah saya lakukan sejauh ini yang pada dasarnya adalah penggabungan string atau apakah ada semacam teknik pemetaan parameter lanjutan yang tidak saya sadari?
IN
klausa.Langsung dari beranda proyek GitHub :
Akan diterjemahkan ke:
sumber
Jika
IN
klausa Anda terlalu besar untuk ditangani MSSQL, Anda bisa menggunakan TableValueParameter dengan Dapper dengan mudah.Buat tipe TVP Anda di MSSQL:
Buat
DataTable
dengan kolom yang sama dengan TVP dan isi dengan nilaiUbah kueri Dapper Anda untuk melakukan hal
INNER JOIN
di tabel TVP:Lulus DataTable di panggilan kueri Dapper Anda
Ini juga berfungsi secara fantastis ketika Anda ingin melakukan pembaruan massal dari banyak kolom - cukup buat TVP dan lakukan
UPDATE
dengan gabungan bagian dalam ke TVP.sumber
ProviderId
untukMyTVP
menjadiPRIMARY KEY CLUSTERED
, karena ini baru saja menyelesaikan masalah kinerja bagi kami (nilai yang kami berikan tidak mengandung duplikat).Berikut ini mungkin cara tercepat untuk meminta sejumlah besar baris dengan Dapper menggunakan daftar ID. Saya berjanji kepada Anda ini lebih cepat daripada hampir semua cara lain yang dapat Anda pikirkan (dengan kemungkinan pengecualian menggunakan TVP seperti yang diberikan dalam jawaban lain, dan yang belum saya uji, tapi saya curiga mungkin lebih lambat karena Anda masih harus mengisi TVP). Ini adalah planet yang lebih cepat dari Dapper menggunakan
IN
sintaks dan semesta lebih cepat dari Entity Framework baris demi baris. Dan itu bahkan benua lebih cepat daripada melewati daftarVALUES
atauUNION ALL SELECT
item. Dapat dengan mudah diperluas untuk menggunakan kunci multi-kolom, cukup tambahkan kolom ekstra keDataTable
, tabel temp, dan kondisi gabungan.Perlu diketahui bahwa Anda perlu belajar sedikit tentang Sisipan Massal. Ada beberapa opsi tentang pemicu pemicu (defaultnya adalah tidak), menghormati batasan, mengunci tabel, memungkinkan penyisipan bersamaan, dan sebagainya.
sumber
DataTable
diperlukan untuk memasukkan massal. Bagaimana Anda menyisipkan tabel temporer 50.000 nilai?Pastikan juga Anda tidak membungkus tanda kurung di sekitar string kueri Anda seperti:
Saya punya ini menyebabkan kesalahan Sintaks SQL menggunakan Dapper 1.50.2, diperbaiki dengan menghapus tanda kurung
sumber
Tidak perlu menambahkan
()
klausa WHERE seperti yang kita lakukan dalam SQL biasa. Karena Dapper melakukan itu secara otomatis untuk kita. Ini diasyntax
: -sumber
Contoh untuk postgres:
sumber
Dalam kasus saya, saya telah menggunakan ini:
variabel saya "id" di baris kedua adalah IEnumerable dari string, juga mereka bisa bilangan bulat kurasa.
sumber
List<string>
?Dalam pengalaman saya, cara paling ramah untuk berurusan dengan ini adalah memiliki fungsi yang mengubah string menjadi tabel nilai.
Ada banyak fungsi splitter yang tersedia di web, Anda akan dengan mudah menemukannya untuk apa pun jika Anda menyukai SQL.
Anda kemudian dapat melakukan ...
Atau
(Atau serupa)
sumber