Как отфильтровать данные внутри свойства навигации - PullRequest
0 голосов
/ 09 июля 2019

Предположим, что у меня есть 2 таблицы «Форма» и «Статус». Таблица формы содержит некоторые свойства и свойство навигации, относящееся к таблице состояния.

// Form table model
public class Form
{
    ...Some properties,
    public ICollection<Status> Statuses { get; set; }
}
// Status table model
public class Status
{     
    ...Some properties,  
    public DateTime FormTimeStart { get; set; }
    public DateTime FormTimeFinish { get; set; }
}

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

var form = _context.Forms
                 .Include(s => s.Statuses.Where  
                   (i => DateTime.Compare(DateTime.Now,i.FormTimeFinish) < 0))
                 .Include(t => t.FormTopics)
                 .ThenInclude(q => q.Questions)
                 .ToList();  

1 Ответ

0 голосов
/ 09 июля 2019

Нет способа сделать это за один запрос. Вам нужно явно загрузить отношение Statuses, после факта:

var form = await _context.Forms
             .Include(t => t.FormTopics)
             .ThenInclude(q => q.Questions)
             .ToListAsync();

form.Statuses = await _context.Entry(form)
    .Collection(x => x.Statuses).Query()
    .Where(i => DateTime.Compare(DateTime.Now, i.FormTimeFinish) < 0))
    .ToListAsync();

Однако, будьте очень осторожными с этим, поскольку у вас есть только подмножество статусов. Поэтому, если вы сделаете что-то вроде попытки сохранить форму, вы в конечном итоге удалите все, чего нет в этом списке (EF будет выглядеть так, как будто вы удалили все остальные статусы из коллекции). По этой причине лучше отключить отслеживание в начальном запросе, чтобы было более очевидно, что что-то не так, если вы случайно забудете и попытаетесь сохранить:

var form = await _context.Forms
    .Include(t => t.FormTopics)
    .ThenInclude(q => q.Questions)
    .AsNoTracking()
    .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...