2009-02-18 54 views
8

我很難將sql轉換爲linq語法。Linq與包含計數的子查詢左連接

我有2個表(Category和CategoryListing),它們用CategoryID互相引用。我需要獲取類別表中所有CategoryID和CategoryList表中所有相應匹配的CategoryID計數的列表。如果一個類別ID不存在於CategoryListing,那麼類別id仍應返回 - 但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上的左連接。 – 2009-02-18 11:06:36

0

我繼續前進,並將整個查詢移動到數據庫上的存儲過程。這首先通過避免LINQ來解決問題。