using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using UserService.DatabaseLayer.DataModels; namespace UserService.DatabaseLayer.Repository { public class OrganizationUnitsRepository : BaseRepository, IOrganizationUnitsRepository { public OrganizationUnitsRepository() : base(x => x.OrganizationUnits) { } /// public override async Task> GetAllAsync( Expression>? predicate = null, CancellationToken token = default) { await using var db = new UserServiceDbContext(); var result = new List(); var rootOus = await Context(db) .Include(x => x.Parent) .WhereOrDefault(predicate) .ToListAsync(cancellationToken: token).ConfigureAwait(false); IEnumerable Rec(Node node) { if (!(node is OrganizationUnit organizationUnit)) yield break; yield return organizationUnit; foreach (var ouChild in rootOus.Where(x => x.ParentId != null && x.ParentId == organizationUnit.Id)) { foreach (var unit in Rec(ouChild)) { yield return unit; } } } foreach (var ou in rootOus.Where(x => x.ParentId is null)) { result.AddRange(Rec(ou)); } return result; } } }