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

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

Linda Hamilton
Lepaskan: 2025-01-25 04:44:09
asal
748 orang telah melayarinya

How to Efficiently Translate a Complex SQL Query with Multiple Joins and Counts into LINQ?

Tukar SQL yang mengandungi berbilang cantuman, kiraan dan cantuman kiri kepada LINQ

Pertanyaan SQL

Pertimbangkan pertanyaan SQL berikut:

<code class="language-sql">SELECT DISTINCT c.Id, 
       c.Title, 
       COUNT(v.Id) AS 'Nb_V2',
       COUNT(DISTINCT v.IdUser) AS 'Nb_V1',
       r.cnt AS 'Nb_R'
FROM TABLE_C c
JOIN TABLE_V v on c.Id = v.Id
LEFT JOIN ( 
    SELECT Id, COUNT(*)  AS cnt 
    FROM TABLE_R 
    GROUP BY Id
) r ON c.Id = r.Id
WHERE c.IdUser = '1234'
GROUP BY c.Id, c.Title, r.cnt</code>
Salin selepas log masuk

Ungkapan pertanyaan LINQ

Untuk menukar pertanyaan SQL ini kepada ungkapan pertanyaan LINQ, sila ikut garis panduan ini:

  1. Tukar subkueri kepada pembolehubah yang diisytiharkan secara berasingan.
  2. Tukar setiap klausa dalam susunan klausa LINQ.
  3. Tukar klausa JOIN kepada sifat navigasi atau objek tanpa nama.
  4. Gunakan GroupJoin dan DefaultIfEmpty() untuk mensimulasikan LEFT JOIN.

Menggunakan peraturan ini menghasilkan ungkapan pertanyaan LINQ berikut:

<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() };

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>
Salin selepas log masuk

Ekspresi Lambda

Untuk penukaran ungkapan lambda, tukarkan LEFT JOIN kepada GroupJoin...SelectMany:

<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>
Salin selepas log masuk

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan