Saya telah mencari di web tetapi saya masih tidak dapat menemukan jawaban yang sederhana. Bisakah seseorang tolong jelaskan (dalam bahasa Inggris sederhana) apa GroupJoin
itu? Apa bedanya dengan batin yang biasa Join
? Apakah ini biasa digunakan? Apakah hanya untuk sintaksis metode? Bagaimana dengan sintaks query? Contoh kode c # akan menyenangkan.
c#
linq
linq-to-entities
duyn9uyen
sumber
sumber
Jawaban:
Tingkah laku
Misalkan Anda memiliki dua daftar:
Ketika Anda
Join
dua daftar diId
lapangan hasilnya adalah:Ketika Anda
GroupJoin
dua daftar diId
lapangan hasilnya adalah:Jadi
Join
menghasilkan hasil datar (tabular) dari nilai induk dan anak.GroupJoin
menghasilkan daftar entri dalam daftar pertama, masing-masing dengan sekelompok entri yang tergabung dalam daftar kedua.Itu sebabnya
Join
sama denganINNER JOIN
di SQL: tidak ada entri untukC
. SedangkanGroupJoin
setara denganOUTER JOIN
:C
ada di set hasil, tetapi dengan daftar kosong entri terkait (dalam set hasil SQL akan ada barisC - null
).Sintaksis
Jadi, biarkan kedua daftar itu menjadi
IEnumerable<Parent>
danIEnumerable<Child>
masing - masing. (Dalam hal Linq ke Entitas:)IQueryable<T>
.Join
sintaks akan menjadimengembalikan
IEnumerable<X>
X di mana adalah jenis anonim dengan dua properti,Value
danChildValue
. Sintaks kueri ini menggunakanJoin
metode di bawah tenda.GroupJoin
sintaks akan menjadimengembalikan suatu
IEnumerable<Y>
tempat Y adalah tipe anonim yang terdiri dari satu properti tipeParent
dan properti tipeIEnumerable<Child>
. Sintaks kueri ini menggunakanGroupJoin
metode di bawah tenda.Kita bisa melakukannya
select g
di kueri terakhir, yang akan memilihIEnumerable<IEnumerable<Child>>
, katakan daftar daftar. Dalam banyak kasus, pilih dengan induk yang disertakan lebih bermanfaat.Beberapa menggunakan case
1. Memproduksi sambungan luar yang rata.
Seperti yang dikatakan, pernyataan ...
... menghasilkan daftar orang tua dengan kelompok anak. Ini dapat diubah menjadi daftar datar pasangan orangtua-anak dengan dua tambahan kecil:
Hasilnya mirip dengan
Perhatikan bahwa variabel rentang
c
digunakan kembali dalam pernyataan di atas. Melakukan hal ini,join
pernyataan apa saja dapat dengan mudah dikonversi menjadiouter join
dengan menambahkan setarainto g from c in g.DefaultIfEmpty()
denganjoin
pernyataan yang ada .Di sinilah sintaks kueri (atau komprehensif) bersinar. Sintaksis metode (atau fasih) menunjukkan apa yang sebenarnya terjadi, tetapi sulit untuk menulis:
Jadi flat
outer join
di LINQ adalahGroupJoin
, diratakan olehSelectMany
.2. Mempertahankan pesanan
Misalkan daftar orang tua sedikit lebih lama. Beberapa UI menghasilkan daftar orang tua yang dipilih sebagai
Id
nilai dalam urutan tetap. Mari kita gunakan:Sekarang orang tua yang dipilih harus disaring dari daftar orang tua dalam urutan yang tepat ini.
Jika kita ...
... urutan
parents
akan menentukan hasilnya. Jika orang tua diperintahkan olehId
, hasilnya adalah orang tua 2, 3, 4, 7. Tidak baik. Namun, kami juga dapat menggunakanjoin
untuk memfilter daftar. Dan dengan menggunakanids
sebagai daftar pertama, pesanan akan dipertahankan:Hasilnya adalah orang tua 3, 7, 2, 4.
sumber
Menurut eduLINQ :
Satu-satunya perbedaan adalah dalam pernyataan pengembalian:
Bergabunglah :
GroupJoin :
Baca lebih lanjut di sini:
Mengimplementasikan kembali LINQ ke Objek: Bagian 19 - Bergabung
Menjalankan kembali LINQ ke Objek: Bagian 22 - GroupJoin
sumber