При работе с потенциально сложными иерархиями это может помочь создать упрощенную структуру необходимых вам данных. Это избавит от необходимости загружать данные, так как данные будут объединены в результатах, загружая то, что необходимо, и обычно может лучше использовать индексы на стороне сервера базы данных.
Например, если вы хотите загрузить «базовые» сведения о категориях, подкатегориях и продуктах, подходящих для отображения в древовидной структуре:
var results = dbContext.Categories.Where(c=> /*some condition*/)
.Select(c=> new {c.CategoryId, c.Name, SubCategories =
c.SubCategories.Select(sc=> new { sc.SubCategoryId, sc.Name, Products = sc.Products.Select(p=> new {p.ProductId, p.Name}) }) }).ToList();
Конечно, это может выглядеть не очень красиво, но никаких волшебных строк для выражений энергичной загрузки, и генерируемый EF SQL, как правило, будет на несколько порядков эффективнее и использует индексы, которые вы обычно хотите использовать для этих таблиц.
Для простых сущностей вы можете использовать это, чтобы .Выбирать дочернюю иерархию, но при работе с более тяжелыми сущностями, где вы просто хотите получить несколько ключевых деталей, это может сэкономить немало времени на обработку и пропускную способность сети, только получая и передавая данные, которые вам нужны.