Rumah >pangkalan data >tutorial mysql >Bagaimana Menerjemahkan Pertanyaan SQL Kompleks dengan Berbilang Gabungan, Kiraan dan Gabungan Kiri ke dalam 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:
DefaultIfEmpty()
. 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!