Menguasai LINQ: Kiraan Rekod Kanak-kanak Tepat di Kiri Sertai dengan Pengumpulan
Menterjemah pertanyaan SQL ke dalam LINQ kepada SQL boleh menjadi rumit, terutamanya apabila menangani senario yang kompleks seperti gabungan kiri, kumpulan dan pengiraan rekod yang tepat. Contoh ini menunjukkan cara mengira rekod anak dengan betul dalam gabungan kiri dengan pengumpulan, menangani masalah biasa.
Pertimbangkan pertanyaan SQL ini:
<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>
Terjemahan LINQ yang naif mungkin mengabaikan perincian penting dalam mengendalikan nilai nol:
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1 from j2 in j1.DefaultIfEmpty() group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count() }</code>
Pendekatan ini salah mengira nilai nol. Penyelesaiannya terletak pada mengubah suai kaedah Count()
untuk menapis nilai ChildId
null:
<code class="language-csharp">from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1 from j2 in j1.DefaultIfEmpty() group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>
Pertanyaan LINQ yang diperhalusi ini hanya mengira nilai bukan nol ChildId
dengan tepat, memberikan kiraan rekod anak yang betul untuk setiap ibu bapa. Ingat untuk sentiasa mengambil kira nol apabila bekerja dengan gabungan kiri dan fungsi agregat dalam LINQ ke SQL untuk memastikan integriti data.
Atas ialah kandungan terperinci Bagaimana Mengira Rekod Kanak-kanak dengan Tepat dalam LINQ Kiri Sertai dengan Kumpulan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!