Angenommen, ich habe diese SQL:
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
Wie kann ich dies in LINQ to SQL übersetzen? Ich blieb bei COUNT (c.ChildId) hängen, die generierte SQL scheint immer COUNT (*) auszugeben. Folgendes habe ich bisher erreicht:
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() }
Danke dir!
c#
.net
linq
linq-to-sql
pbz
quelle
quelle
Verwenden Sie eine Unterabfrage:
Wenn die Abfragetypen durch eine Zuordnung verbunden sind, vereinfacht sich dies zu:
quelle
let
Schlüsselwort generiert eine Unterabfrage, die mit der @ Mosh-Gruppe verbunden ist.SPÄTE ANTWORT:
Sie sollten den linken Join überhaupt nicht benötigen, wenn Sie nur Count () ausführen. Beachten Sie, dass
join...into
tatsächlich übersetzt wird, inGroupJoin
welche Gruppierungen zurückgegeben werden,new{parent,IEnumerable<child>}
sodass Sie nurCount()
die Gruppe aufrufen müssen :In der Syntax der Erweiterungsmethode
join into
entspricht aGroupJoin
(während ajoin
ohne eininto
istJoin
):quelle
Während die Idee hinter der LINQ-Syntax darin besteht, die SQL-Syntax zu emulieren, sollten Sie nicht immer daran denken, Ihren SQL-Code direkt in LINQ zu übersetzen. In diesem speziellen Fall müssen wir keine Gruppierung durchführen, da die Verknüpfung eine Gruppenverbindung ist.
Hier ist meine Lösung:
Im Gegensatz zu dem meisten Lösung hier gestimmt hat , haben wir nicht brauchen j1 , j2 und null Prüfung in Count (t => t.ChildId! = Null)
quelle
quelle