簡體   English   中英

EF核心左外部聯接失敗,且可為空的對象必須具有一個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM