2009-02-18 8 views
8

Tengo dificultades para traducir la sintaxis sql a linq.Linq con combinación izquierda en SubQuery que contiene el recuento

Tengo 2 tablas (Category y CategoryListing) que se referencian entre sí con CategoryID. Necesito obtener una lista de todos los CategoryID en la tabla Category y el recuento de CategoryID para todas las coincidencias correspondientes en la tabla de CategoryListing. Si un CategoryID no está presente en CategoryListing, entonces el CategoryID todavía debe ser devuelto - pero con una frecuencia de 0.

demuestra esperan los siguientes resultados: consulta SQL

SELECT c.CategoryID, COALESCE(cl.frequency, 0) as frequency 
FROM Category c 
LEFT JOIN (
    SELECT cl.CategoryID, COUNT(cl.CategoryID) as frequency 
    FROM CategoryListing cl 
    GROUP BY cl.CategoryID 
) as cl 
ON c.CategoryID = cl.CategoryID 
WHERE c.GuideID = 1 

Respuesta

13

no han sido evaluados, pero esto debe hacer el truco:

var q = from c in ctx.Category 
     join clg in 
      (
       from cl in ctx.CategoryListing 
       group cl by cl.CategoryID into g 
       select new { CategoryID = g.Key, Frequency = g.Count()} 
      ) on c.CategoryID equals clg.CategoryID into cclg 
     from v in cclg.DefaultIfEmpty() 
     where c.GuideID==1 
     select new { c.CategoryID, Frequency = v.Frequency ?? 0 }; 
+0

Frans, Gracias por la respuesta rápida. Esto funciona genial, excepto que necesito un join de izquierda en clg. –

+0

No creo que exista realmente nada parecido a un join de izquierda en LINQ ... –

+0

¡Oh! mi mal, lo arreglaré. solo un segundo –

0

Pasé y moví toda la consulta a un Procedimiento almacenado en la base de datos. Esto resuelve el problema al evitar LINQ en primer lugar.

Cuestiones relacionadas