Первый запрос:
return await Context.Set<Category>()
.Where(c => c.CategoryId == id)
.OrderBy(c => c.Description)
.ToListAsync();
Не возвращает дочерние элементы, потому что вы загружаете только Category
, который соответствует идентификатору, предоставленному из базы данных.Если вам нужны дети, вам нужно Include(c => c.Children)
Второй запрос:
return await Context.Set<Category>()
.OrderBy(c => c.Description)
.ToListAsync();
Не имеет фильтра, поэтому EF Core загружает все Categories
из базы данных.Он содержит дочерние элементы, поскольку эти сущности также загружаются как «родительские» объекты, поэтому Entity будет сопоставлять свойство Navigation с помощью внешних ключей, поскольку сущности уже отслеживаются в контексте.
Например, если высделал это:
Category parentCategory = await Context.Set<Category>()
.SingleOrDefaultAsync(c => c.CategoryId == id);
List<Category> childCategories = await Context.Set<Category>()
.Where(c => c.ParentCategoryId == parentCategory.CategoryId)
.ToListAsync();
Тогда parentCategory
заполнил бы его свойство Children
, даже если вы их не Include()
, а потому что все сущности отслеживались в пределах одной и той же области.DbContext
отношения сопоставлены.В приведенном выше коде, если вы поместите точку останова во второй оператор и проверите parentCategory
, вы увидите, что его свойство Children
не имеет элементов до тех пор, пока вы не выполните второй оператор.