В настоящее время я борюсь с запросом EntityFramework Core.
В основном я применяю левое внешнее соединение (помимо других внутренних соединений).
Первая таблица - Solutions
, и она в основном является основой, а отдельная таблица 'SolutionViews' отслеживает каждый view
из Solution
, поэтому, скажем, решение с идентификатором 1 имеет 2 представления, вы найдете 2 строки в SolutionViews
, которые указывают на SolutionId. В конце я объединяю все строки на основе SolutionId, чтобы получить общее количество просмотров для решения.
Вот SQL-запрос, который я в основном пытаюсь повторить:
SELECT solution.Id, solution.Name, category.Name, Count(solutionView.SolutionId) As 'Views'
FROM Solutions solution
JOIN Categories category on solution.CategoryId = category.Id
LEFT JOIN SolutionViews solutionView on solution.Id = solutionView.SolutionId
GROUP BY solution.Id, solution.Name, category.Name
ORDER BY Views desc
Результат этого запроса выглядит следующим образом:
Id Name CategoryId Name Views
9 Solution4 3 Category1 3
1 Solution1 1 Category2 2
2 Solution2 2 Category1 1
8 Solution3 3 Category3 0
10 Solution5 3 Category3 0
Использование EF Core 2.1 Сначала я попробовал так называемый «свободный» синтаксис (как мне понравилась концепция) с использованием только LINQ, но переключился на синтаксис запроса ниже:
var query = (from solution in context.Solutions
join category in context.Categories
on solution.CategoryId equals category.Id
join view in context.SolutionViews.GroupBy(sv => sv.SolutionId)
.Select(g => new {
SolutionId = g.Key,
Views = g.Count()
})
on solution.Id equals view.SolutionId into a
from b in a.DefaultIfEmpty()
select new SolutionWithViewsDto {
Solution = solution,
Views = b == null ? 0 : b.Views
}
);
Я упустил OrderBy, так как динамически добавляю его позже на основе спецификаций поиска API, но сейчас этот запрос предоставляет мне исключение:
System.InvalidOperationException: 'Обнуляемый объект должен иметь значение.'
Я почти уверен, что это происходит из-за того, что в некоторых записях нет записей в таблице SolutionViews, и, следовательно, я неправильно выполняю LEFT OUTER JOIN.