Scott
Scott

Reputation: 1253

How can I recursively retrieve a hierarchy of records using EF Core?

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

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);

Upvotes: 0

Views: 514

Answers (1)

Shahafo
Shahafo

Reputation: 255

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).

Upvotes: 2

Related Questions