Dengan asumsi saya memiliki gabung luar kiri sebagai berikut:
from f in Foo
join b in Bar on f.Foo_Id equals b.Foo_Id into g
from result in g.DefaultIfEmpty()
select new { Foo = f, Bar = result }
Bagaimana cara saya mengungkapkan tugas yang sama menggunakan metode ekstensi? Misalnya
Foo.GroupJoin(Bar, f => f.Foo_Id, b => b.Foo_Id, (f,b) => ???)
.Select(???)
c#
linq-to-sql
lambda
LaserJesus
sumber
sumber
GroupJoin
bagian luar kiri bergabung,SelectMany
bagian itu hanya diperlukan tergantung pada apa yang ingin Anda pilih.Karena ini tampaknya menjadi pertanyaan SO de facto untuk gabungan luar kiri menggunakan metode (ekstensi) sintaks, saya pikir saya akan menambahkan alternatif untuk jawaban yang dipilih saat ini bahwa (dalam pengalaman saya setidaknya) telah lebih umum daripada setelah
Untuk menampilkan perbedaan menggunakan kumpulan data sederhana (dengan asumsi kita sendiri menggabungkan nilai-nilai itu):
Opsi 2 berlaku untuk definisi gabungan luar kiri tipikal, tetapi seperti yang saya sebutkan sebelumnya seringkali tidak perlu tergantung pada kumpulan data.
sumber
Single
pemeriksaan di tengah bergabung.SingleOrDefault
namun merupakan cara yang lebih "benar" untuk menunjukkan IMO ini.Metode Group Join tidak diperlukan untuk mencapai penggabungan dua set data.
Bergabunglah dengan Batin:
Untuk Gabung Kiri cukup tambahkan DefaultIfEmpty ()
EF dan LINQ menjadi SQL dengan benar bertransformasi menjadi SQL. Untuk LINQ to Objects, lebih baik bergabung menggunakan GroupJoin karena secara internal menggunakan Pencarian . Tetapi jika Anda meminta DB maka melewatkan GroupJoin adalah AFAIK sebagai pemain.
Personlay untuk saya dengan cara ini lebih mudah dibaca dibandingkan dengan GroupJoin (). SelectMany ()
sumber
Anda dapat membuat metode ekstensi seperti:
sumber
Memperbaiki jawaban Ocelot20, jika Anda memiliki tabel, Anda tidak perlu bergabung dengan tempat di mana Anda hanya ingin 0 atau 1 baris darinya, tetapi bisa memiliki beberapa, Anda harus Memesan tabel bergabung Anda:
Kalau tidak, baris mana yang Anda dapatkan di join akan menjadi acak (atau lebih spesifik, mana db yang terjadi untuk menemukan pertama).
sumber
Mengubah jawaban Marc Gravell menjadi metode ekstensi, saya membuat yang berikut ini.
sumber
Sementara jawaban yang diterima bekerja dan bagus untuk Linq to Objects, saya disadap bahwa query SQL bukan hanya Left Outer Join yang lurus.
Kode berikut ini bergantung pada Proyek LinkKit yang memungkinkan Anda untuk menyampaikan ekspresi dan memohonnya ke permintaan Anda.
Dapat digunakan sebagai berikut
sumber
Ada solusi mudah untuk ini
Cukup gunakan .HasValue di Select Anda
Sangat mudah, tidak perlu untuk bergabung dengan grup atau apa pun
sumber