using PoweredSoft.Data.Core; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; namespace PoweredSoft.Data { public class AsyncQueryableService : IAsyncQueryableService { public AsyncQueryableService(IEnumerable asyncQueryableFactories) { AsyncQueryableFactories = asyncQueryableFactories; } public IEnumerable AsyncQueryableFactories { get; } public Task CountAsync(IQueryable queryable, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).CountAsync(queryable, cancellationToken); public Task FirstOrDefaultAsync(IQueryable queryable, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).FirstOrDefaultAsync(queryable, cancellationToken); public Task FirstOrDefaultAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).FirstOrDefaultAsync(queryable, predicate, cancellationToken); private IAsyncQueryableHandlerService GetAsyncQueryableHandlerOrThrow(IQueryable queryable) { var handler = this.GetAsyncQueryableHandler(queryable); if (handler == null) throw new NoAsyncQueryableHandlerServiceWasRegisteredForThisProviderException(); return handler; } public IAsyncQueryableHandlerService GetAsyncQueryableHandler(IQueryable queryable) { var handler = AsyncQueryableFactories.FirstOrDefault(t => t.CanHandle(queryable)); return handler; } public Task LongCountAsync(IQueryable queryable, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).LongCountAsync(queryable, cancellationToken); public Task> ToListAsync(IQueryable queryable, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).ToListAsync(queryable, cancellationToken); public Task AnyAsync(IQueryable queryable, Expression> predicate, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).AnyAsync(queryable, predicate, cancellationToken); public Task AnyAsync(IQueryable queryable, CancellationToken cancellationToken = default(CancellationToken)) => GetAsyncQueryableHandlerOrThrow(queryable).AnyAsync(queryable, cancellationToken); } }