«Значение не может быть нулевым. Имя параметра: источник» при выполнении вложенного запроса на платформе сущностей - PullRequest
2 голосов
/ 23 мая 2019

У меня следующий код, в котором я получаю сообщение об ошибке при загрузке Peers:

Значение не может быть нулевым. Имя параметра: источник

Я использую методы FirstOrDefault и DefaultIfEmpty, и внутри оператора 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();

1 Ответ

3 голосов
/ 23 мая 2019

Старайтесь избегать конструкции 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 не нужны в проекционных запросах, поскольку они игнорируются .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...