Katakanlah saya punya 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
Bagaimana saya bisa menerjemahkan ini ke dalam LINQ ke SQL? Saya terjebak di COUNT (c.ChildId), SQL yang dihasilkan sepertinya selalu menghasilkan COUNT (*). Inilah yang saya dapatkan sejauh ini:
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() }
Terima kasih!
c#
.net
linq
linq-to-sql
pbz
sumber
sumber
Pertimbangkan menggunakan subquery:
Jika tipe kueri dihubungkan oleh asosiasi, ini menyederhanakan untuk:
sumber
let
kata kunci akan menghasilkan subquery yang sama dengan solusi gabungan @Mosh group.JAWABAN TERLAMBAT:
Anda seharusnya tidak perlu bergabung dengan kiri sama sekali jika semua yang Anda lakukan adalah Hitung (). Perhatikan bahwa
join...into
sebenarnya diterjemahkanGroupJoin
yang mengembalikan pengelompokan sepertinew{parent,IEnumerable<child>}
sehingga Anda hanya perlu memanggilCount()
grup:Dalam sintaksis Metode Ekstensi a
join into
setara denganGroupJoin
(sementarajoin
tanpainto
adalahJoin
):sumber
Walaupun ide di balik sintaksis LINQ adalah untuk meniru sintaks SQL, Anda tidak harus selalu berpikir untuk secara langsung menerjemahkan kode SQL Anda ke dalam LINQ. Dalam kasus khusus ini, kita tidak perlu melakukan group into sejak bergabung adalah grup join sendiri.
Inilah solusi saya:
Tidak seperti solusi yang paling banyak dipilih di sini, kita tidak perlu memeriksa j1 , j2 , dan null dalam Hitungan (t => t.ChildId! = Null)
sumber
sumber