Ошибка EF Core Left Outer Join с обнуляемым объектом должна иметь значение - PullRequest
1 голос
/ 28 июня 2019

В настоящее время я борюсь с запросом 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.

1 Ответ

0 голосов
/ 02 июля 2019

Кредиты поступают к Ивану Стоеву, я просто даю на это видимый ответ.Синтаксис запроса, кажется, ведет себя немного глючно, но в итоге то, что сработало, использовало только Navigation Properties, что тоже намного проще.Все, что мне нужно было сделать, это применить .Count() к свойству навигации SolutionsView, которое даст вам количество просмотров для каждой отдельной записи Solution.

var query = context.Solutions
                .Select(s => new SolutionDto {
                    Id = s.Id,
                    Name = s.Name,
                    Description = s.Description,
                    Category = new CategoryDto {
                        Id = s.Category.Id,
                        Name = s.Category.Name
                    },
                    Views = s.SolutionViews.Count()
                });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...