Linq с левым соединением по подзапросу, содержащему счетчик
Вопрос
У меня возникли трудности с переводом синтаксиса sql в linq.
У меня есть две таблицы (Category и CategoryListing), которые ссылаются друг на друга с помощью CategoryID.Мне нужно получить список всех идентификаторов категорий в таблице категорий и количество идентификаторов категорий для всех соответствующих совпадений в таблице категорий.Если CategoryID отсутствует в списке категорий, то 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
Решение
Не проверялось, но это должно помочь:
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 };
Другие советы
Я пошел дальше и переместил весь запрос в хранимую процедуру в базе данных.Это решает проблему, прежде всего, избегая LINQ.
Не связан с StackOverflow