2009-02-18 13 views
8

Mam trudności z tłumaczeniem sql na składnię linq.Linq z Left Join na subQuery zawierające numer

Mam 2 tabele (Category i CategoryListing), które odwołują się do siebie z CategoryID. Potrzebuję uzyskać listę wszystkich CategoryID w tabeli kategorii i Count of CategoryID dla wszystkich odpowiednich meczów w tabeli CategoryListing. Jeśli IDkategorii nie jest obecny w CategoryListing, wówczas IDkategorii nadal powinien być zwrócony - ale z częstotliwością 0.

demonstruje oczekiwane następujące zapytanie SQL Wyniki:

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 

Odpowiedz

13

nie testowano, ale powinno to zrobić podstęp:

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, Dzięki za szybką odpowiedź. Działa to świetnie, chyba że potrzebuję lewy dołączyć na clg. –

+0

Nie wierzę, że istnieje naprawdę coś takiego jak lewe dołączenie do LINQ ... –

+0

Oh! moje złe, naprawię to. tylko sekundę –

0

Poszedłem dalej i przeniosłem całe zapytanie do zapisanej procedury w bazie danych. Rozwiązuje to problem, unikając LINQ w pierwszej kolejności.