Linq con LEFT JOIN sul SubQuery contenente Conte
Domanda
Sto avendo difficoltà a tradurre sql per la sintassi LINQ.
Ho 2 tavoli (Categoria e CategoryListing), che fanno riferimento a vicenda con IDCategoria. Ho bisogno di ottenere un elenco di tutti i IDCategoria nella Tabella categoria e il conte di IDCategoria per tutte le partite corrispondenti nella tabella CategoryListing. Se un IDCategoria non è presente in CategoryListing, poi l'IDCategoria dovrebbe comunque essere restituito -. Ma con una frequenza di 0
la seguente query SQL dimostra risultati attesi:
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
Soluzione
Non testato, ma questo dovrebbe fare il trucco:
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 };
Altri suggerimenti
Sono andato avanti e si è trasferito l'intera query ad una stored procedure sul database. Questo risolve il problema evitando LINQ in primo luogo.