Powiedzmy, że mam ten SQL:
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
Jak mogę przetłumaczyć to na LINQ to SQL? Utknąłem na COUNT (c.ChildId), wygenerowany kod SQL zawsze wydaje się wyprowadzać COUNT (*). Oto, co mam do tej pory:
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() }
Dziękuję Ci!
c#
.net
linq
linq-to-sql
pbz
źródło
źródło
Rozważ użycie podzapytania:
Jeśli typy zapytań są połączone asocjacją, upraszcza to:
źródło
let
słowem kluczowym wygeneruje podzapytanie tak samo jak rozwiązanie przyłączone do grupy @Mosh.SPÓŹNIONA ODPOWIEDŹ:
W ogóle nie powinieneś potrzebować lewego złączenia, jeśli wszystko, co robisz, to Count (). Zauważ, że w
join...into
rzeczywistości jest przetłumaczone naGroupJoin
które zwraca grupowanie, taknew{parent,IEnumerable<child>}
więc wystarczy zadzwonićCount()
do grupy:W składni metody rozszerzenia a
join into
jest równoważneGroupJoin
(podczas gdy ajoin
bezinto
jestJoin
):źródło
Chociaż ideą składni LINQ jest emulacja składni SQL, nie należy zawsze myśleć o bezpośrednim tłumaczeniu kodu SQL na LINQ. W tym konkretnym przypadku nie musimy włączać grupy w, ponieważ dołączanie do jest dołączaniem do samej grupy.
Oto moje rozwiązanie:
W przeciwieństwie do najczęściej wybieranego tutaj rozwiązania, nie potrzebujemy sprawdzania j1 , j2 i null w Count (t => t.ChildId! = Null)
źródło
źródło