In Entity Framework Core we can have recursive entities. But we cannot do an "Include" for these recursives (can we?). So I wrote a Get
-method that does it for me:
First, this is my RecursiveEntity<T>
base-class:
public class Entity : IEntity
{
[Key]
public int Id { get; set; }
}
public abstract class RecursiveEntity<TEntity> : Entity, IRecursiveEntity<TEntity>
where TEntity : RecursiveEntity<TEntity>
{
public virtual TEntity Parent { get; set; }
public virtual ICollection<TEntity> Children { get; set; }
}
And this is my Repository
-base-class for recurisve entities:
public abstract class RecursiveRepository<T, TDataContext>
where T : RecursiveEntity<T> where TDataContext : DbContext
{
protected IEnumerable<T> Get(Expression<Func<T, bool>> expression)
{
IQueryable<T> parents = DataContext.Set<T>()
.Include(x => x.Children)
.Where(w => w.Parent == null)
.Where(expression);
foreach (T entity in parents)
{
if (entity.Children != null && entity.Children.Any())
entity.Children = _getChildren(entity, expression).ToList();
yield return entity;
}
}
private IEnumerable<T> _getChildren(T parentEntity, Expression<Func<T, bool>> expression)
{
IQueryable<T> children = DataContext.Set<T>()
.Include(x => x.Parent)
.Where(w => w.Parent != null && w.Parent.Id == parentEntity.Id)
.Where(expression);
foreach (T entity in children)
{
entity.Children = _getChildren(entity, expression).ToList();
yield return entity;
}
}
}
Any suggestion what I can do better?
Is it a good solution to do that many DataContext<Set>
-accesses and assign them to the parent with ToList()
?