Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengira Rekod Kanak-Kanak dengan Tepat dalam LINQ Kiri Sertai dan Kumpulan Oleh?

Bagaimana Mengira Rekod Kanak-Kanak dengan Tepat dalam LINQ Kiri Sertai dan Kumpulan Oleh?

DDD
DDDasal
2025-01-08 20:21:56901semak imbas

How to Accurately Count Child Records in a LINQ Left Join and Group By?

LINQ – Petua untuk penyertaan kiri, pengumpulan dan pengiraan tepat

Menukar pertanyaan SQL yang kompleks kepada LINQ kepada SQL kadangkala boleh menjadi rumit. Contoh biasa ialah melakukan gabungan kiri, kumpulan mengikut lajur dan mengira bilangan rekod yang memenuhi syarat tertentu.

Pertimbangkan pertanyaan SQL berikut:

<code class="language-sql">SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
  LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId</code>

Pertanyaan ini mendapatkan semula ParentId dan kiraan ChildId yang sepadan daripada dua jadual, ParentTable dan ChildTable.

Untuk menukar ini kepada LINQ kepada SQL, mula-mula lakukan gabungan kiri:

<code class="language-csharp">from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1</code>

Walau bagaimanapun, bahagian COUNT(c.ChildId) perlu dikendalikan dengan berhati-hati. Tanpa pertimbangan khusus, SQL yang dijana LINQ akan sentiasa mengembalikan COUNT(*), yang mungkin tidak memberikan hasil yang diharapkan.

Untuk mengira dengan tepat hanya nilai ChildId yang sepadan, tambahkan yang berikut selepas klausa into:

<code class="language-csharp">from j2 in j1.DefaultIfEmpty()</code>

Ini memastikan bahawa jika tiada rekod anak yang sepadan ditemui, nilai nol diberikan kepada j2.

Akhir sekali, lakukan pengumpulan dan pengiraan:

<code class="language-csharp">group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>

Kod ini dikumpulkan mengikut ParentId dan hanya mengira rekod yang ChildIdnya tidak kosong. Hasilnya ialah objek dengan sifat ParentId dan Count, sepadan dengan format pertanyaan SQL asal. Ini memastikan bahawa kami hanya mengira kes di mana sub-rekod wujud, mengelakkan nilai nol yang disebabkan oleh cantuman kiri yang menjejaskan ketepatan keputusan pengiraan.

Atas ialah kandungan terperinci Bagaimana Mengira Rekod Kanak-Kanak dengan Tepat dalam LINQ Kiri Sertai dan Kumpulan Oleh?. 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