LINQ ke SQL: Menguasai Gabungan Luar Kiri dengan Berbilang Kriteria
Menterjemah pertanyaan SQL ke dalam LINQ kepada SQL boleh menjadi rumit, terutamanya dengan gabungan yang kompleks. Artikel ini memfokuskan pada senario biasa: melakukan gabungan luar kiri dengan berbilang syarat.
Cabaran SQL:
Titik permulaan kami ialah pertanyaan SQL yang menggunakan gabungan luar kiri antara jadual 'tempoh' dan 'fakta'. Cantuman menggunakan dua syarat: 'p.id = f.periodid' dan 'f.otherid = 17'. Syarat kedua bertindak sebagai penapis.
Halangan LINQ:
KaedahLINQ DefaultIfEmpty()
ialah pendekatan biasa untuk sambung luar kiri. Walau bagaimanapun, hanya menambah 'f.otherid = 17' pada klausa where
selepas gabungan tidak berfungsi seperti yang diharapkan.
Penyelesaian LINQ yang Berkesan:
Kuncinya ialah menggunakan syarat gabungan kedua sebelum menggunakan DefaultIfEmpty()
. Berikut adalah dua kaedah yang cekap:
Kaedah 1: Menggunakan Sintaks Kaedah Sambungan:
<code class="language-csharp">from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in fg.Where(f => f.otherid == 17).DefaultIfEmpty() where p.companyid == 100 select fgi.value</code>
Kaedah 2: Menggunakan Subkueri:
<code class="language-csharp">from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in (from f in fg where f.otherid == 17 select f).DefaultIfEmpty() where p.companyid == 100 select fgi.value</code>
Mengapa Ini Berfungsi:
Perbezaan penting terletak pada penempatan keadaan. Meletakkan 'f.otherid == 17' dalam klausa where
selepas DefaultIfEmpty()
akan menapis keluar baris dengan 'f' adalah batal (kerana gabungan tidak menemui padanan). Dengan meletakkannya dalam klausa Where()
sebelum DefaultIfEmpty()
, kami menapis sebelum nilai nol diperkenalkan, memastikan gelagat sambung luar kiri yang betul. Ambil perhatian bahawa kami memilih fgi.value
dan bukannya f.value
untuk mengendalikan null dengan betul dalam kaedah pertama.
Atas ialah kandungan terperinci Bagaimana untuk Melakukan Gabungan Luar Kiri dengan Pelbagai Syarat dalam LINQ ke SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!