Linq с левым соединением в подзапросе, содержащем Count - PullRequest
8 голосов
/ 18 февраля 2009

У меня проблемы с переводом синтаксиса sql в linq.

У меня есть 2 таблицы (Category и CategoryListing), которые ссылаются друг на друга с CategoryID. Мне нужно получить список всех CategoryID в таблице категорий и количество CategoryID для всех соответствующих совпадений в таблице CategoryListing. Если 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

Ответы [ 2 ]

13 голосов
/ 18 февраля 2009

Не проверено, но это должно сработать:

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 голосов
/ 13 февраля 2014

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

...