Saya memiliki daftar yang berisi Id dari UserProfile
tabel saya . Bagaimana cara memilih semua UserProfiles
berdasarkan daftar ID yang saya var
gunakan LINQ
?
var idList = new int[1, 2, 3, 4, 5];
var userProfiles = _dataContext.UserProfile.Where(......);
Saya terjebak di sini. Saya bisa melakukan ini menggunakan for loop dll. Tapi saya lebih suka melakukan ini dengan LINQ
.
Jawaban:
Anda bisa menggunakannya
Contains()
untuk itu. Ini akan terasa sedikit mundur ketika Anda benar-benar mencoba menghasilkanIN
klausa, tetapi ini harus dilakukan:Saya juga berasumsi bahwa setiap
UserProfile
record akan memilikiint
Id
field. Jika bukan itu masalahnya, Anda harus menyesuaikannya.sumber
Contains()
akan menangani pemeriksaan persamaan itu pada setiapid
nilai jika Anda menggunakannya seperti yang saya tulis di jawaban. Anda tidak perlu menulis secara eksplisit di==
mana pun saat mencoba membandingkan item dari satu set (larik) dengan yang lain (tabel database).Solusi dengan .Where dan .Contains memiliki kompleksitas O (N square). Sederhana .Join harus memiliki kinerja yang jauh lebih baik (mendekati O (N) karena hashing). Jadi kode yang benar adalah:
Dan sekarang hasil pengukuran saya. Saya menghasilkan 100.000 ProfilPengguna dan 100.000 id. Bergabung mengambil 32ms dan. Dimana dengan .Contains membutuhkan waktu 2 menit dan 19 detik! Saya menggunakan IEnumerable murni untuk pengujian ini untuk membuktikan pernyataan saya. Jika Anda menggunakan List, bukan IEnumerable, .Where dan .Contains akan lebih cepat. Pokoknya perbedaannya signifikan. Yang tercepat. Di mana. Berisi adalah dengan Set <>. Semua itu tergantung pada kompleksitas kolom yang mendasari untuk .Contains. Lihat posting ini untuk mempelajari tentang kompleksitas LINQ. Lihat contoh pengujian saya di bawah ini:
Keluaran konsol:
sumber
List
digunakan. +1Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
error saat menggunakan LINQ2SQL datacontext.Jawaban bagus di atas, tapi jangan lupakan satu hal PENTING - mereka memberikan hasil yang berbeda!
Ini akan mengembalikan 2 baris dari DB (dan ini mungkin benar, jika Anda hanya ingin daftar pengguna yang disortir berbeda)
TETAPI dalam banyak kasus, Anda mungkin menginginkan daftar hasil yang tidak diurutkan . Anda harus selalu memikirkannya seperti kueri SQL. Silakan lihat contoh dengan keranjang belanja eshop untuk menggambarkan apa yang terjadi:
Ini akan mengembalikan 5 hasil dari DB. Dalam kasus ini, menggunakan 'berisi' akan menjadi salah.
sumber
Itu seharusnya sederhana. Coba ini:
sumber