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:
SELECT p.ParentId, COUNT(c.ChildId) FROM ParentTable p LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId GROUP BY p.ParentId
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:
from p in context.ParentTable join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
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
:
from j2 in j1.DefaultIfEmpty()
Ini memastikan bahawa jika tiada rekod anak yang sepadan ditemui, nilai nol diberikan kepada j2.
Akhir sekali, lakukan pengumpulan dan pengiraan:
group j2 by p.ParentId into grouped select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }
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!