EFCore: запрос связанного объекта на основе максимального значения в поле в связанном объекте - PullRequest
0 голосов
/ 12 декабря 2018

Мне нужно запросить связанный объект на основе максимального значения в поле в связанном объекте, а затем отобразить результаты этого элемента.

Например, определены модели:

public class Student
{
    public int StudentID {get; set;}
    public string Name {get; set;}
    public ICollection<ReportCard> ReportCards {get; set;}
}

public class ReportCard
{
    public int ReportCardID {get; set;}
    public int ProjectID { get; set; }
    public Project Project { get; set; }
    public int Result {get; set;}
    public int Comment {get; set;}
    public DateTime PublishDate {get; set;}
}

В контроллере бритвы:

public class LatestResultsModel : PageModel
{
    ...
    public IList<Student> Students {get; set;}
    public async Task<IActionResult> OnGetAsync()
    {
        Students = await _context.Student
                                 .Include(student => student.ReportCard)
                                 .ToListAsync();
    }
}

В представлении бритвы:

@foreach (Student student in Model.Students)
{
    <p>@student.Name</p>
    <p>@student.ReportCard.Max(i => i.PublishDate).Result.ToString()</p>
}

После оператора Max я не могу запросить другие поля.Я попытался сделать несколько вещей, чтобы добиться такого результата фильтрации связанных данных.

Отфильтрованные включения не поддерживаются.

Существует ли какой-либо тип соединения, который может достичьэтот результат?

Он также не обрабатывает ситуацию, когда у ученика нет ReportCard.InvalidOperationException: обнуляемый объект должен иметь значение.

1 Ответ

0 голосов
/ 12 декабря 2018

После оператора Max я не могу запросить другие поля.Я пробовал несколько вещей, чтобы добиться такого результата фильтрации связанных данных.

Да!Ты не можешь!потому что оператор Max выбирает только поле, которое вы упомянули в Max.

Он также не обрабатывает ситуацию, когда у ученика нет ReportCard.InvalidOperationException: объект Nullable должен иметь значение.

Для преодоления обеих проблем выполните следующие действия:

@foreach (Student student in Model.Students)
{
    <p>@student.Name</p>

    if(student.ReportCards.Count > 0)
    {
      <p>@student.ReportCards.OrderByDescending(rc => rc.PublishDate).FirstOrDefault().Result.ToString()</p>

      <p>@student.ReportCards.OrderByDescending(rc => rc.PublishDate).FirstOrDefault().PublishDate.ToString()</p>
    }
    else
    {
      <p>Student has no report card!</p>
    }

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