【问题标题】:"Value cannot be null. Parameter name: source" when running a nested query on entity framework“值不能为空。参数名称:源”在实体框架上运行嵌套查询时
【发布时间】:2019-05-23 16:09:24
【问题描述】:

我有以下代码在加载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();

【问题讨论】:

  • 实体ReviewRounds的Submissions属性需要在构造函数中初始化为new SomeCollection<T>()
  • @MatJ 感谢您的回复。能否请您详细说明一下?
  • @EdPlunkett 这是 LINQ to Entities 投影查询 - 它必须转换为 SQL,因此根本不涉及“对象” - 实体仅用作元数据。
  • @IvanStoev 好吧,我认为那里的某处很可能是空的。

标签: c# asp.net entity-framework entity-framework-core


【解决方案1】:

尝试避免 FirstOrDefault().Something 构造 - 表达式树不支持您通常在类似的 LINQ to Objects 查询中使用的 ?. 运算符,并且 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,因为它们是ignored

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    相关资源
    最近更新 更多