Я пытаюсь выполнить запрос с условным включением. Я видел несколько вариантов, один из которых был с проекцией. Мне также нужно, чтобы я мог получить доступ к свойствам из отфильтрованного списка.
Связь между сущностями:
(Parent) 1-n (List of children) 1-1 (Grand Child)
Я попробовал вариант с проекцией с проекцией, и он сработал, но не смог для доступа к свойству из отфильтрованного списка. Я потерял много времени, пытаясь заставить это работать, и, используя метод «попробуй и провал», мне это удается, но я замечаю то, чего не понимаю, и это меня очень беспокоит. Вот мой код:
public IQueryable<Parent> Parents()
{
GrandChildId = ....;
_contextProvider.Context.Parents.Where(c => "condition").Include(b =>
b.ChildrenList.Select(f => f.GrandChild)).ToList(); //PART 1------------------
var parentsList = _contextProvider.Context.Parents.Where(condition).Select(parents => new
{
Parents = parents,
ChildrenList = parents.ChildrenList.Where(b => b.GrandChild.Id == GrandChildId),
}
).ToList().Select(row =>
{
var item = row.Parents;
item.ChildrenList = (ICollection<ChildrenList>)row.ChildrenList;
return item;
}
); //PART 2--------------------
return parentsList.AsQueryable();
}
Если вы спросите меня, я считаю «Часть 1» неуместной, но если я удалю ее и попытаюсь добавить в «Часть 2», она больше не работает (Grand Child больше не доступен). Кажется, что включение из первой части сохраняется во втором запросе.
Все свойства навигации «виртуальные».