[英]EF Core Left Outer Join failing with nullable object must have a value
我目前正在努力處理EntityFramework Core查詢。 基本上,我正在應用左外部聯接(其他內部聯接除外)。
第一個表是Solutions
,基本上奠定了基礎,一個單獨的表“SolutionViews”跟蹤每個單一view
一個的Solution
,讓我們說有ID為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上做錯了。
感謝Ivan Stoev,我只是為此提供了一個可見的答案。 查詢語法似乎有點問題,但最后所做的只是使用Navigation Properties
,這也容易得多。 我要做的就是在SolutionsView
導航屬性上應用.Count()
,它將為您提供每個單獨的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()
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.