0

I am using EF Core 2.1. I have a Group object that has the following properties:

  • int GroupId
  • int? ParentGroupId
  • Group ParentGroup

The object references the GroupId of its parent using the ParentGroupId property. The depth of the hierarchy is not known when querying. How can I retrieve the entire hierarchy?

I've tried the following, which will get me three levels deep, but how can I get all levels of the hierarchy without knowing the depth? Do I need to rely on a stored proc?

var group = await _membershipDbContext.Groups
    .Include(g => g.ParentGroup)
        .ThenInclude(g => g.ParentGroup)
    .SingleOrDefaultAsync(g => g.GroupId == id);
Scott
  • 1,223
  • 2
  • 16
  • 35
  • Probably what you're looking for is this: https://stackoverflow.com/questions/41827918/loading-a-full-hierarchy-from-a-self-referencing-table-with-entityframework-core – Webreaper Jun 01 '22 at 11:51

1 Answers1

2

You have three options:

  1. Use lazy loading. This way every time you'll access the parent group, it will automatically loaded from the database.
  2. Use explicit loading for recursively load the parent groups (see explicit loading)
  3. Create a view or stored procedure in the database that will return all the data you need and then create the object graph manually.

Which method is right for you depends on your unique use-case and the amount of data to load. Options 1 and 2 are not that different from each other, but with option 2 you control when the objects are loaded. Option 3 will probably be the most efficient, but might pose problems when saving back changes (as you transform the object graph manually).

Shahafo
  • 235
  • 1
  • 7