using PoweredSoft.DbContext.Core; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; namespace PoweredSoft.DbContext { public class QueryableExtensionService : IQueryableExtensionService { private readonly IEnumerable services; public QueryableExtensionService(IEnumerable services) { this.services = services; } public IQueryableService ResolveService(IQueryable queryable) { var service = this.services.FirstOrDefault(t => t.CanHandle(queryable)); if (service == null) throw new Exception($"Could not resolve any service to execute operation.."); return service; } public IQueryableService ResolveService(IQueryable queryable) { var service = this.services.FirstOrDefault(t => t.CanHandle(queryable)); if (service == null) throw new Exception($"Could not resolve any service to execute operation.."); return service; } public IQueryable AsNoTracking(IQueryable source) where T : class => ResolveService(source).AsNoTracking(source); public IQueryable AsNoTracking(IQueryable source) => ResolveService(source).AsNoTracking(source); public Task FirstOrDefaultAsync(IQueryable source, CancellationToken cancellationToken = default) where T : class => ResolveService(source).FirstOrDefaultAsync(source, cancellationToken: cancellationToken); public Task FirstOrDefaultAsync(IQueryable source, Expression> predicate, CancellationToken cancellationToken = default) where T : class => ResolveService(source).FirstOrDefaultAsync(source, predicate, cancellationToken: cancellationToken); public Task FirstAsync(IQueryable source, CancellationToken cancellationToken = default) where T : class => ResolveService(source).FirstAsync(source, cancellationToken: cancellationToken); public Task FirstAsync(IQueryable source, Expression> predicate, CancellationToken cancellationToken = default) where T : class => ResolveService(source).FirstAsync(source, predicate, cancellationToken: cancellationToken); public Task AnyAsync(IQueryable source, CancellationToken cancellationToken = default) where T : class => ResolveService(source).AnyAsync(source, cancellationToken: cancellationToken); public Task AnyAsync(IQueryable source, Expression> predicate, CancellationToken cancellationToken = default) where T : class => ResolveService(source).AnyAsync(source, predicate, cancellationToken: cancellationToken); public IQueryable Include(IQueryable source, Expression> path) where T : class => ResolveService(source).Include(source, path); public IQueryable Include(IQueryable source, string path) where T : class => ResolveService(source).Include(source, path); public Task> ToListAsync(IQueryable source, CancellationToken cancellationToken = default) where T : class => ResolveService(source).ToListAsync(source, cancellationToken: cancellationToken); } }