Entity Framework Core: как включить объект, связанный с нулевым значением, с его свойствами нулевого столбца?

Я работаю над проектом, в котором используются EF Core и .Net Core.

У меня есть 2 класса Entity. Это отношения один ко многим. Допустим, «Студент» N ‹-----› 1 «Класс».

public class Student{
  public string Id {get;set;}
  public string Name {get;set;}
  public string GradeId {get;set;}
  public Grade grade {get;set;}
}

public class Grade{
  public string Id {get;set;}
  public string StudentGrade {get;set;}
}

Мой LINQ для нетерпеливой загрузки студента, как это

_dbcontext.Student.Include(s => s.Grade).ToList();

Иногда я создаю запись об ученике, но не устанавливаю для нее оценку. В результате оценка будет нулевой. Поскольку я использую WebAPI для этой работы, мне нужно вернуть вложенный JSON, который всегда включает Grade и его свойства, независимо от того, имеет ли Grade значение null или нет.


person MTLC    schedule 22.02.2021    source источник


Ответы (1)


Самое простое решение - инициализировать свойство после материализации:

var students = _dbcontext.Student
    .Include(s => s.Grade)
    .AsNoTracking()
    .ToList();

Grade emptyGrade = null;
foreach(var s in students)
{
   if (s.Grade == null)
   {
      emptyGrade ??= new Grade();
      s.Grade = emptyGrade;
   }
}

Также есть еще вариант с пользовательской проекцией

var query = 
   from s in _dbcontext.Student
   select new Student
   {
       Id = s.Id,
       Name = s.Name,
       GradeId = s.GradeId,
       grade = s.grade ?? new Grade()
   };

var students = query.ToList();
person Svyatoslav Danyliv    schedule 22.02.2021
comment
Возможно, var emptyGrade = new Grade(); ? - person Serge; 22.02.2021
comment
Или, может быть, var emptyGrade = new Grade { StudentGrade = No Grade}; ? - person Serge; 22.02.2021
comment
@Сергей Зачем вводить ненужные выделения? - person Johnathan Barclay; 22.02.2021
comment
Мне нравится этот ответ. @MTLC, я думаю, что ключевой момент в этом ответе заключается в том, что формирование объекта для JSON на самом деле не является проблемой EF (хранение) и может быть выполнено после чтения объекта EF, что может помочь разделить слои. - person Jamie F; 22.02.2021
comment
foreach(var s in students) s.Grade ??= new Grade() будет достаточно. - person Johnathan Barclay; 22.02.2021
comment
@Svyatoslav Danyliv: Большое спасибо!!! Работает как часы. - person MTLC; 22.02.2021