2009-02-18 3 views
8

У меня возникли трудности с переводом sql в linq синтаксис.Linq with Left Присоединиться к SubQuery, содержащему счет

У меня есть 2 таблицы (категория и категорияList), которые ссылаются друг на друга с CategoryID. Мне нужно получить список всех CategoryID в таблице категорий и счетчика категорий для всех соответствующих совпадений в таблице CategoryList. Если CategoryID нет в CategoryListing, то CategoryID все равно должны быть возвращены, - но с частотой 0.

Следующий 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 

ответ

13

Не тестировался, но это следует делать трюк:

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, Спасибо за быстрый ответ. Это отлично работает, за исключением того, что мне нужно левое соединение на clg. –

+0

Я не верю, что в LINQ есть что-то вроде левого соединения ... –

+0

О! мой плохой, исправит это. всего в секундах –

0

Я пошел вперед и перевел весь запрос на хранимую процедуру в базе данных. Это решает проблему, избегая при этом LINQ.

Смежные вопросы