Saya memiliki dua koleksi yang memiliki properti Email
di kedua koleksi. Saya perlu mendapatkan daftar item di daftar pertama di mana Email
tidak ada di daftar kedua. Dengan SQL saya hanya akan menggunakan "tidak dalam", tapi saya tidak tahu padanan dalam LINQ. Bagaimana itu dilakukan?
Sejauh ini saya sudah bergabung, seperti ...
var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };
Tapi saya tidak bisa bergabung karena saya butuh perbedaan dan bergabung akan gagal. Saya perlu beberapa cara menggunakan Berisi atau Ada saya percaya. Saya belum menemukan contoh untuk melakukan itu.
Jawaban:
Saya tidak tahu apakah ini akan membantu Anda tetapi ..
dari klausa NOT IN di LINQ ke SQL oleh Marco Russo
sumber
Anda menginginkan operator Kecuali.
Penjelasan yang lebih baik di sini: https://docs.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators
CATATAN: Teknik ini hanya berfungsi untuk tipe primitif saja, karena Anda harus mengimplementasikan IEqualityComparer untuk menggunakan
Except
metode dengan tipe kompleks.sumber
list1.Select(item => new { Property1 = item.Property1, Property2 = item.Property2 }).Except(list2.Select( item => new { Property1 = item.Property1, Property2 = item.Property2 }));
ini sangat berguna ketika Anda menentukan kesetaraan dengan mengevaluasi hanya satu set nilai dari tipe kompleks.IEquatityComparor<T,T>
atau mengganti metode perbandingan objek dalamLinqToSql
skenario; untuk, permintaan akan direpresentasikan sebagai / dikompilasi ke / dinyatakan sebagai SQL; dengan demikian nilai akan diperiksa, bukan referensi objek.except
saya dapat mempercepat permintaan LINQ dari 8-10 detik menjadi setengah detikUntuk orang-orang yang mulai dengan sekelompok objek di-memori dan menanyakan terhadap database, saya telah menemukan ini sebagai cara terbaik untuk pergi:
Ini menghasilkan
WHERE ... IN (...)
klausa yang bagus dalam SQL.sumber
sumber
Anda dapat menggunakan kombinasi Where and Any untuk menemukan yang tidak ada di:
sumber
Anda dapat mengambil kedua koleksi dalam dua daftar berbeda, misalkan list1 dan list2.
Maka cukup tulis
Ini akan bekerja
sumber
Jika seseorang menggunakan ADO.NET Entity Framework , solusi EchoStorm juga berfungsi dengan baik. Tapi aku butuh beberapa menit untuk melilitkan kepalaku. Dengan asumsi Anda memiliki konteks basis data, dc, dan ingin menemukan baris dalam tabel x tidak tertaut pada tabel y, jawaban jawaban lengkapnya tampak seperti:
Menanggapi komentar Andy, ya, seseorang dapat memiliki dua dari dalam kueri LINQ. Ini contoh kerja yang lengkap, menggunakan daftar. Setiap kelas, Foo and Bar, memiliki ID. Foo memiliki referensi "kunci asing" ke Bar melalui Foo.BarId. Program memilih semua Foo yang tidak ditautkan ke Bar yang sesuai.
sumber
sumber
Satu juga bisa digunakan
All()
sumber
Meskipun
Except
merupakan bagian dari jawaban, itu bukan jawaban keseluruhan. Secara default,Except
(seperti beberapa operator LINQ) melakukan perbandingan referensi pada jenis referensi. Untuk membandingkan dengan nilai dalam objek, Anda harusIEquatable<T>
tipe Anda, atauEquals
danGetHashCode
dalam tipe Anda, atauIEqualityComparer<T>
untuk tipe Andasumber
Contoh menggunakan Daftar int untuk kesederhanaan.
sumber
Bagi siapa saja yang juga ingin menggunakan
IN
operator yang mirip SQL di C #, unduh paket ini:Itu memiliki
In
danNotIn
metode:Bahkan Anda bisa menggunakannya dengan cara ini
sumber
Terima kasih, Brett. Saran Anda juga membantu saya. Saya punya daftar Objek dan ingin memfilter menggunakan daftar objek lain. Terima kasih lagi....
Jika ada yang butuh, silakan lihat contoh kode saya:
sumber
Saya tidak menguji ini dengan LINQ ke Entitas :
Kalau tidak:
sumber
Tidak bisakah Anda melakukan gabungan luar, hanya memilih item dari daftar pertama jika grup kosong? Sesuatu seperti:
Saya tidak yakin apakah ini akan bekerja dengan cara efisien apa pun dengan kerangka kerja Entity.
sumber
Atau Anda dapat melakukannya seperti ini:
sumber