Bagaimana cara melakukan outer outer join di C # LINQ ke objek tanpa menggunakan join-on-equals-into
klausa? Apakah ada cara untuk melakukannya dengan where
klausa? Masalah yang benar: Untuk join dalam, mudah dan saya punya solusi seperti ini
List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
select new JoinPair { LeftId = l.Id, RightId = r.Id})
tapi untuk sambungan luar kiri saya butuh solusi. Milik saya adalah sesuatu seperti ini tetapi tidak berfungsi
List< JoinPair> leftFinal = (from l in lefts from r in rights
select new JoinPair {
LeftId = l.Id,
RightId = ((l.Key==r.Key) ? r.Id : 0
})
di mana JoinPair adalah kelas:
public class JoinPair { long leftId; long rightId; }
Jawaban:
Sebagaimana dinyatakan pada:
101 Sampel LINQ - Gabung luar kiri
sumber
Jika penyedia LINQ yang digerakkan oleh basis data digunakan, gabungan luar kiri yang jauh lebih mudah dibaca dapat ditulis seperti itu:
Jika Anda menghilangkan
DefaultIfEmpty()
Anda akan memiliki gabung dalam.Ambil jawaban yang diterima:
Sintaks ini sangat membingungkan, dan tidak jelas cara kerjanya ketika Anda ingin bergabung dengan tabel MULTIPLE.
Catatan
Perlu dicatat bahwa
from alias in Repo.whatever.Where(condition).DefaultIfEmpty()
ini sama dengan outer-apply / left-join-lateral, yang mana setiap pengoptimal-basis data (yang layak) mampu menerjemahkan ke dalam join kiri, selama Anda tidak memperkenalkan per-baris -nilai (alias terluar yang sebenarnya berlaku). Jangan lakukan ini di Linq-2-Objects (karena tidak ada DB-optimizer ketika Anda menggunakan Linq-to-Objects).Contoh terperinci
Ketika digunakan dengan LINQ 2 SQL, ia akan menerjemahkan dengan baik ke kueri SQL yang sangat mudah dibaca berikut ini:
Edit:
Lihat juga " Konversi permintaan SQL Server ke permintaan Linq " untuk contoh yang lebih kompleks.
Juga, Jika Anda melakukannya di Linq-2-Objects (bukan Linq-2-SQL), Anda harus melakukannya dengan cara kuno (karena LINQ ke SQL menerjemahkan ini dengan benar untuk bergabung dengan operasi, tetapi lebih dari objek metode ini memaksakan pemindaian penuh, dan tidak mengambil keuntungan dari pencarian indeks, bagaimanapun ...):
sumber
join
jauh lebih mudah dibaca dan jelas daripadawhere
diikuti olehDefaultIfEmpty
Menggunakan ekspresi lambda
sumber
Enumerable.Empty<Product>.DefaultIfEmpty()
akan mengembalikan IEnumerable dengan nilai tunggaldefault(Product)
.Sekarang sebagai metode ekstensi:
Gunakan seperti biasanya Anda gunakan bergabung:
Semoga ini menghemat waktu Anda.
sumber
Lihatlah contoh ini . Kueri ini seharusnya berfungsi:
sumber
r
diakses di klausa pilih setelah menggunakan gabungan ke?r
padafrom
klausa kedua . mis.from r in lrs.DefaultIfEmpty()
Kalau tidak, kueri ini tidak masuk akal dan bahkan mungkin tidak dikompilasi karena dir
luar konteks untuk pemilihan.Clockwise
dengan John Cleese, lol.Implementasi gabungan luar kiri dengan metode ekstensi dapat terlihat seperti
Selektor hasil kemudian harus mengurus elemen nol. Fx.
sumber
lihat contoh ini
sekarang Anda dapat
include elements from the left
bahkan jika elemen ituhas no matches in the right
, dalam kasus kami kami mengambil kembaliArlene
bahkan dia tidak cocok di sebelah kanandi sini adalah referensi
Cara: Melakukan Penggabungan Luar Kiri (Panduan Pemrograman C #)
sumber
Ini adalah bentuk umum (sebagaimana telah disediakan dalam jawaban lain)
Namun inilah penjelasan yang saya harap akan menjelaskan apa arti sebenarnya ini!
pada dasarnya menciptakan set hasil yang terpisah b_temp yang secara efektif menyertakan null 'rows' untuk entri di sisi kanan (entri di 'b').
Kemudian baris selanjutnya:
..iterates atas hasil yang ditetapkan, mengatur nilai nol default untuk 'baris' di sisi kanan, dan mengatur hasil dari baris sisi kanan bergabung dengan nilai 'b_value' (yaitu nilai yang ada di kanan di sisi lain, jika ada catatan yang cocok, atau 'nol' jika tidak ada).
Sekarang, jika sisi kanan adalah hasil dari permintaan LINQ yang terpisah, itu akan terdiri dari jenis anonim, yang hanya bisa berupa 'sesuatu' atau 'nol'. Namun, jika enumerable (mis. Daftar - di mana MyObjectB adalah kelas dengan 2 bidang), maka dimungkinkan untuk spesifik tentang nilai default 'null' yang digunakan untuk propertinya:
Ini memastikan bahwa 'b' itu sendiri bukan nol (tetapi propertinya bisa nol, menggunakan nilai null default yang telah Anda tentukan), dan ini memungkinkan Anda untuk memeriksa properti b_value tanpa mendapatkan pengecualian referensi nol untuk b_value. Perhatikan bahwa untuk DateTime yang dapat dibatalkan, jenis (DateTime?) Yaitu 'nullable DateTime' harus ditentukan sebagai 'Jenis' dari nol dalam spesifikasi untuk 'DefaultIfEmpty' (ini juga akan berlaku untuk jenis yang tidak secara asli 'nullable mis. double, float).
Anda dapat melakukan beberapa gabungan luar kiri hanya dengan merantai sintaks di atas.
sumber
Berikut ini contoh jika Anda perlu bergabung lebih dari 2 tabel:
Ref: https://stackoverflow.com/a/17142392/2343
sumber
Metode ekstensi yang berfungsi seperti gabung kiri dengan Gabung sintaks
hanya menulisnya di .NET core dan tampaknya berfungsi seperti yang diharapkan.
Tes kecil:
sumber
Berikut ini adalah versi yang cukup mudah dimengerti menggunakan sintaksis metode:
sumber
Ada tiga tabel: orang, sekolah, dan person_schools, yang menghubungkan orang-orang dengan sekolah tempat mereka belajar. Referensi ke orang dengan id = 6 tidak ada dalam tabel persons_schools. Namun orang dengan id = 6 disajikan dalam hasil lef-join grid.
sumber
Ini adalah sintaks SQL dibandingkan dengan sintaks LINQ untuk gabungan luar dalam dan kiri. Kiri Luar Gabung:
http://www.ozkary.com/2011/07/linq-to-entity-inner-and-left-joins.html
"Contoh berikut ini grup bergabung antara produk dan kategori. Ini pada dasarnya adalah gabungan kiri. Ekspresi ke dalam mengembalikan data bahkan jika tabel kategori kosong. Untuk mengakses properti dari tabel kategori, kita sekarang harus memilih dari hasil yang dapat dihitung dengan menambahkan pernyataan dari cl di catList.DefaultIfEmpty ().
sumber
Lakukan sambungan luar kiri di linq C # // Lakukan sambungan luar kiri
https://dotnetwithhamid.blogspot.in/
sumber
Saya ingin menambahkan bahwa jika Anda mendapatkan ekstensi MoreLinq sekarang ada dukungan untuk gabungan kiri yang homogen dan heterogen sekarang
http://morelinq.github.io/2.8/ref/api/html/Overload_MoreLinq_MoreEnumerable_LeftJoin.htm
contoh:
EDIT:
Dalam retrospeksi ini mungkin berhasil, tetapi itu mengubah IQueryable ke IEnumerable sebagai morelinq tidak mengubah kueri ke SQL.
Anda dapat menggunakan GroupJoin sebagai gantinya diuraikan di sini: https://stackoverflow.com/a/24273804/4251433
Ini akan memastikan bahwa ia tetap sebagai IQueryable jika Anda perlu melakukan operasi logis lebih lanjut di kemudian hari.
sumber
Cara mudah adalah dengan menggunakan kata kunci Biarkan. Ini bekerja untuk saya.
Ini adalah simulasi Left Join. Jika setiap item dalam tabel B tidak cocok dengan item, BItem mengembalikan nol
sumber
Jika Anda perlu bergabung dan memfilter sesuatu, itu bisa dilakukan di luar gabung. Filter dapat dilakukan setelah membuat koleksi.
Dalam hal ini jika saya melakukan ini dalam kondisi bergabung saya mengurangi baris yang dikembalikan.
Kondisi ternary digunakan
(= n == null ? "__" : n.MonDayNote,)
Jika objeknya
null
(jadi tidak ada yang cocok), maka kembalikan apa yang ada setelah?
.__
, pada kasus ini.Lain, kembali apa setelah
:
,n.MonDayNote
.Berkat kontributor lain di situlah saya mulai dengan masalah saya sendiri.
sumber
KELUARAN
sumber
Sesuai jawaban saya untuk pertanyaan serupa, di sini:
Linq ke SQL kiri luar bergabung menggunakan sintaks Lambda dan bergabung pada 2 kolom (kunci gabungan bergabung)
Dapatkan kodenya di sini , atau tiru repo github saya , dan mainkan!
Pertanyaan:
Lambda:
sumber
Ikhtisar: Dalam cuplikan kode ini, saya mendemonstrasikan cara mengelompokkan berdasarkan ID di mana Table1 dan Table2 memiliki hubungan satu ke banyak. Saya grup di Id, Field1, dan Field2. Subquery sangat membantu, jika pencarian Tabel ketiga diperlukan dan itu akan membutuhkan hubungan join kiri. Saya menunjukkan pengelompokan bergabung kiri dan linq subquery. Hasilnya setara.
sumber
sumber
Solusi sederhana untuk LEFT OUTER BERGABUNG :
catatan :
sumber
setA
dansetB
dalam jawabannya.