Digamos que eu tenho esse SQL:
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
Como posso traduzir isso em LINQ to SQL? Fiquei preso na COUNT (c.ChildId), o SQL gerado sempre parece gerar COUNT (*). Aqui está o que eu tenho até agora:
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() }
Obrigado!
c#
.net
linq
linq-to-sql
pbz
fonte
fonte
Considere usar uma subconsulta:
Se os tipos de consulta estiverem conectados por uma associação, isso simplifica para:
fonte
let
palavra - chave gerará uma subconsulta igual à solução ingressada no grupo @Mosh.RESPOSTA ATRASADA:
Você não precisa da junção esquerda se tudo o que está fazendo é Count (). Observe que,
join...into
na verdade, é traduzido para oGroupJoin
qual retorna agrupamentos comonew{parent,IEnumerable<child>}
esse; você só precisa chamarCount()
o grupo:Na sintaxe do método de extensão, a
join into
é equivalente aGroupJoin
(enquanto ajoin
sem uminto
éJoin
):fonte
Embora a idéia por trás da sintaxe do LINQ seja emular a sintaxe do SQL, você não deve sempre pensar em traduzir diretamente seu código SQL no LINQ. Nesse caso em particular, não precisamos nos agrupar, já que ingressar é um ingresso em grupo.
Aqui está a minha solução:
Diferentemente da solução mais votada aqui, não precisamos das verificações j1 , j2 e nula no Count (t => t.ChildId! = Null)
fonte
fonte