Rumah >pangkalan data >tutorial mysql >Bagaimana cara menterjemahkan pertanyaan SQL yang kompleks dengan pelbagai gabungan, mengira, dan kiri bergabung dengan setara linq?

Bagaimana cara menterjemahkan pertanyaan SQL yang kompleks dengan pelbagai gabungan, mengira, dan kiri bergabung dengan setara linq?

Patricia Arquette
Patricia Arquetteasal
2025-01-25 04:21:08667semak imbas

How to translate a complex SQL query with multiple joins, COUNT, and a left join into its LINQ equivalent?

Tukar SQL yang mengandungi berbilang gabungan, COUNT dan gabungan kiri kepada LINQ

Pertanyaan SQL yang diberikan mengandungi berbilang cantuman (termasuk cantuman kiri) dan pengagregatan menggunakan fungsi COUNT dan COUNT(DISTINCT). Matlamatnya adalah untuk menukar pertanyaan ini kepada LINQ yang setara untuk digunakan dalam lapisan akses data aplikasi.

Pertanyaan SQL:

<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>

Pemahaman pertanyaan LINQ:

Salah satu cara untuk menukar pertanyaan SQL kepada pemahaman pertanyaan LINQ ialah menggunakan cantuman bersarang dan kumpulan jenis tanpa nama. Walau bagaimanapun, menukar fungsi COUNT dan COUNT(DISTINCT) kepada sintaks LINQ boleh mencabar.

Ekspresi Lambda:

Penyelesaian yang lebih bersih kepada transformasi LINQ boleh dilaksanakan menggunakan ungkapan lambda. Dengan memanfaatkan gabungan...selectMany operasi dan kumpulan, pertanyaan boleh ditulis seperti berikut:

<code class="language-csharp">var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() }), 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 }) //处理r可能为空的情况
                  .Select(cvrg => new { 
                      cvrg.Key.Title, 
                      Nb_V2 = cvrg.Count(), 
                      Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), 
                      Nb_R = cvrg.Key.cnt 
                  });</code>

Panduan Terjemahan:

Untuk menukar pertanyaan SQL kepada LINQ dengan cekap, garis panduan berikut boleh digunakan:

  • Subpilihan hendaklah diubah secara bebas melainkan ia merujuk kepada lajur luaran.
  • Pengendali monad tunggal dan pengendali agregat boleh digunakan terus pada hasil pertanyaan LINQ.
  • Jenis tanpa nama digunakan untuk mewakili berbilang lajur.
  • Klausa sertai diwakili oleh sifat navigasi atau objek tanpa nama.
  • Penyertaan kiri memerlukan GroupJoin...SelectMany. Beri perhatian kepada pengendalian kes yang r mungkin kosong dan tambah semakan nilai nol yang sepadan dalam GroupBy dan Select.

Jawapan yang disemak ini menambah baik pertanyaan LINQ dengan mengendalikan potensi nilai nol r.cnt dalam klausa GroupBy dan Select, menjadikannya lebih mantap Ulasan menjelaskan perubahan ini , menyediakan panduan terjemahan yang jelas dan tepat daripada SQL kepada LINQ.

Atas ialah kandungan terperinci Bagaimana cara menterjemahkan pertanyaan SQL yang kompleks dengan pelbagai gabungan, mengira, dan kiri bergabung dengan setara 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