繁体   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