簡體   English   中英

“值不能為空。 在實體框架上運行嵌套查詢時,“參數名稱:源”

[英]“Value cannot be null. Parameter name: source” when running a nested query on entity framework

我有以下代碼,在加載Peers時出現錯誤:

值不能為空。 參數名稱:來源

我正在使用FirstOrDefaultDefaultIfEmpty方法,並且在select語句中,我還在檢查對象是否為空m => m == null ? 但是,我無法避免該錯誤。 有任何想法嗎?

 ReviewRoundDTO_student results = _context.ReviewRounds
                .Include(rr => rr.ReviewTasks).ThenInclude(rt => rt.ReviewTaskStatuses)
                .Include(rr => rr.Submissions).ThenInclude(s => s.PeerGroup.PeerGroupMemberships).ThenInclude(m => m.User)
                .Include(rr => rr.Rubric)
                .Where(rr => rr.Id == reviewRoundId)
                .Select(rr => new ReviewRoundDTO_student
                {
                    Id = rr.Id,
                    SubmissionId = rr.Submissions.FirstOrDefault(s => s.StudentId == currentUser.Id).Id,
                    Peers = rr.Submissions.FirstOrDefault(s => s.StudentId == currentUser.Id)
                                .PeerGroup.PeerGroupMemberships.DefaultIfEmpty()
                                .Select(m => m == null ? new ApplicationUserDto { } : new ApplicationUserDto
                                {
                                    //FullName = m.User.FullName,
                                    //Id = new Guid(m.UserId)
                                }),

                    }).FirstOrDefault();

嘗試避免使用FirstOrDefault().Something構造表達式樹不支持?. 您通常在與對象查詢類似的LINQ中使用的運算符,並且EF Core當前在正確轉換它方面存在問題-如果查看異常堆棧跟蹤,則很有可能該異常來自EF Core基礎結構,而沒有涉及用戶代碼。

我建議不使用此類構造重寫LINQ查詢,例如這樣的事情:

var results = _context.ReviewRounds
    .Where(rr => rr.Id == reviewRoundId)
    .Select(rr => new ReviewRoundDTO_student
    {
        Id = rr.Id,
        SubmissionId = rr.Submissions
           .Where(s => s.StudentId == currentUser.Id)
           .Select(s => s.Id)
           .FirstOrDefault(),
        Peers = rr.Submissions
            .Where(s => s.StudentId == currentUser.Id)
            .Take(1)
            .SelectMany(s => s.PeerGroup.PeerGroupMemberships)
            .Select(m => new ApplicationUserDto
            {
                FullName = m.User.FullName,
                Id = m.UserId
            })
            .ToList(),
   })
   .FirstOrDefault();

請注意,投影查詢中不需要Include / ThenInclude ,因為它們被忽略了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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