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:
SELECT p.ParentId, COUNT(c.ChildId) FROM ParentTable p LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId GROUP BY p.ParentId
Terjemahan LINQ yang naif mungkin mengabaikan perincian penting dalam mengendalikan nilai nol:
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() }
Pendekatan ini salah mengira nilai nol. Penyelesaiannya terletak pada mengubah suai kaedah Count()
untuk menapis nilai ChildId
null:
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) }
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!