Rumah >pangkalan data >tutorial mysql >Bagaimana Menerjemahkan Pertanyaan SQL Kompleks dengan Berbilang Gabungan, Kiraan dan Gabungan Kiri ke dalam LINQ?

Bagaimana Menerjemahkan Pertanyaan SQL Kompleks dengan Berbilang Gabungan, Kiraan dan Gabungan Kiri ke dalam LINQ?

DDD
DDDasal
2025-01-25 04:10:09756semak imbas

How to Translate Complex SQL Queries with Multiple Joins, Counts, and Left Joins into LINQ?

Tukar sambung berbilang jadual kompleks, kira dan kiri sertai pertanyaan SQL kepada LINQ

Apabila pertanyaan SQL sedia ada anda melibatkan cantuman kompleks, kiraan dan cantuman kiri, anda perlu menukarnya kepada ungkapan LINQ yang setara. Mari kita pecahkan proses dan tangani cabaran khusus yang dihadapi.

Fahami peraturan penukaran

Menukar SQL kepada LINQ memerlukan pemahaman peraturan penukaran khusus yang terlibat. Beberapa prinsip utama termasuk:

  • Subkueri berasingan boleh ditukar kepada pembolehubah berasingan, manakala subkueri yang merujuk lajur luaran memerlukan tanda kurungan.
  • Klausa sertai boleh dinyatakan dengan menggabungkan alias jadual dan syarat kesamaan.
  • Gabungan kiri dilaksanakan menggunakan sifat navigasi dan kaedah DefaultIfEmpty().
  • Fungsi dan kiraan pengagregatan boleh dilaksanakan menggunakan agregat LINQ (cth., Count(), Distinct().Count()).

Penukaran pertanyaan SQL

Memandangkan pertanyaan SQL yang disediakan, kami mula-mula mentakrifkan subkueri untuk mengira kiraan:

<code class="language-csharp">var subrq = from r in Table_R
            group r by r.Id into rg
            select new { Id = rg.Key, cnt = rg.Count() };</code>

Sekarang, untuk pertanyaan utama:

<code class="language-csharp">var ansq = (from c in Table_C
            join v in Table_V on c.Id equals v.Id
            join r in subrq on c.Id equals r.Id into rj
            from r in rj.DefaultIfEmpty()
            where c.IdUser == "1234"
            group new { c, v, r } by new { c.Id, c.Title, r.cnt } into cvrg
            select new {
                cvrg.Key.Title,
                Nb_V2 = cvrg.Count(),
                Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(),
                Nb_R = (int?)cvrg.Key.cnt
            }).Distinct();</code>

Ungkapan LINQ ini melaksanakan operasi cantum, kumpulan dan kira yang diperlukan.

Penukaran ungkapan Lambda

Untuk penukaran ungkapan lambda, kita boleh menggunakan kaedah GroupJoin() dan SelectMany() untuk mengendalikan cantuman kiri:

<code class="language-csharp">var subr2 = Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() });
var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(subr, cv => cv.c.Id, r => r.Id, (cv, rj) => new { cv.c, cv.v, rj })
                  .SelectMany(cvrj => cvrj.rj.DefaultIfEmpty(), (cvrj, r) => new { cvrj.c, cvrj.v, r })
                  .GroupBy(cvr => new { cvr.c.Id, cvr.c.Title, cvr.r.cnt })
                  .Select(cvrg => new { cvrg.Key.Title, Nb_V2 = cvrg.Count(), Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), Nb_R = (int?)cvrg.Key.cnt });</code>

Ungkapan gaya lambda ini mencapai tugas yang sama seperti pemahaman pertanyaan.

Atas ialah kandungan terperinci Bagaimana Menerjemahkan Pertanyaan SQL Kompleks dengan Berbilang Gabungan, Kiraan dan Gabungan Kiri ke dalam LINQ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn