Disons que j'ai ce SQL:
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
Comment puis-je traduire cela en LINQ to SQL? Je suis resté bloqué au COUNT (c.ChildId), le SQL généré semble toujours afficher COUNT (*). Voici ce que j'ai jusqu'à présent:
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() }
Je vous remercie!
c#
.net
linq
linq-to-sql
pbz
la source
la source
Pensez à utiliser une sous-requête:
Si les types de requêtes sont connectés par une association, cela se simplifie en:
la source
let
mot clé générera une sous-requête identique à la solution jointe au groupe @Mosh.RÉPONSE TARDIVE:
Vous ne devriez pas du tout avoir besoin de la jointure gauche si vous ne faites que Count (). Notez que
join...into
c'est en fait traduit dansGroupJoin
quels groupes retourne commenew{parent,IEnumerable<child>}
si vous avez juste besoin d'appelerCount()
le groupe:Dans la syntaxe de la méthode d'extension, a
join into
est équivalent àGroupJoin
(tandis que ajoin
sans aninto
estJoin
):la source
Alors que l'idée derrière la syntaxe LINQ est d'émuler la syntaxe SQL, vous ne devriez pas toujours penser à traduire directement votre code SQL en LINQ. Dans ce cas particulier, nous n'avons pas besoin de faire de groupe dans car rejoindre est un groupe se joindre.
Voici ma solution:
Contrairement à la solution la plus votée ici, nous n'avons pas besoin de vérifier j1 , j2 et null dans Count (t => t.ChildId! = Null)
la source
la source