Digamos que tengo este SQL:
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
¿Cómo puedo traducir esto a LINQ to SQL? Me atasqué en COUNT (c.ChildId), el SQL generado siempre parece generar COUNT (*). Esto es lo que obtuve hasta ahora:
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() }
¡Gracias!
c#
.net
linq
linq-to-sql
pbz
fuente
fuente
Considere usar una subconsulta:
Si los tipos de consulta están conectados por una asociación, esto se simplifica a:
fuente
let
palabra clave generará una subconsulta igual que la solución unida al grupo @Mosh.RESPUESTA TARDÍA:
No debería necesitar la combinación izquierda en absoluto si todo lo que está haciendo es Count (). Tenga en cuenta que en
join...into
realidad se traduce a loGroupJoin
que devuelve agrupaciones,new{parent,IEnumerable<child>}
por lo que solo necesita llamarCount()
al grupo:En la sintaxis del Método de extensión a
join into
es equivalente aGroupJoin
(mientras que ajoin
sin aninto
esJoin
):fuente
Si bien la idea detrás de la sintaxis LINQ es emular la sintaxis SQL, no siempre debe pensar en traducir directamente su código SQL a LINQ. En este caso particular, no necesitamos hacer group into ya que join into es un grupo en sí.
Aquí está mi solución:
A diferencia de la solución más votada aquí, no necesitamos j1 , j2 y comprobación nula en Count (t => t.ChildId! = Null)
fuente
fuente