mirror of https://github.com/abpframework/abp
Revised IAsyncQueryableExecuter and implemented chain of responsibility to support multiple providers in a single application.
parent
6304c7c7cf
commit
eca7781dc1
@ -0,0 +1,53 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace Volo.Abp.Linq
|
||||
{
|
||||
public class AsyncQueryableExecuter : IAsyncQueryableExecuter, ITransientDependency
|
||||
{
|
||||
protected IEnumerable<IAsyncQueryableProvider> Providers { get; }
|
||||
|
||||
public AsyncQueryableExecuter(IEnumerable<IAsyncQueryableProvider> providers)
|
||||
{
|
||||
Providers = providers;
|
||||
}
|
||||
|
||||
public virtual Task<int> CountAsync<T>(
|
||||
IQueryable<T> queryable,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var provider = FindProvider(queryable);
|
||||
return provider != null
|
||||
? provider.CountAsync(queryable, cancellationToken)
|
||||
: Task.FromResult(queryable.Count());
|
||||
}
|
||||
|
||||
public virtual Task<List<T>> ToListAsync<T>(
|
||||
IQueryable<T> queryable,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var provider = FindProvider(queryable);
|
||||
return provider != null
|
||||
? provider.ToListAsync(queryable, cancellationToken)
|
||||
: Task.FromResult(queryable.ToList());
|
||||
}
|
||||
|
||||
public virtual Task<T> FirstOrDefaultAsync<T>(
|
||||
IQueryable<T> queryable,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var provider = FindProvider(queryable);
|
||||
return provider != null
|
||||
? provider.FirstOrDefaultAsync(queryable, cancellationToken)
|
||||
: Task.FromResult(queryable.FirstOrDefault());
|
||||
}
|
||||
|
||||
protected virtual IAsyncQueryableProvider FindProvider<T>(IQueryable<T> queryable)
|
||||
{
|
||||
return Providers.FirstOrDefault(p => p.CanExecute(queryable));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,37 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Volo.Abp.Linq
|
||||
{
|
||||
public class DefaultAsyncQueryableExecuter : IAsyncQueryableExecuter
|
||||
{
|
||||
public static DefaultAsyncQueryableExecuter Instance { get; } = new DefaultAsyncQueryableExecuter();
|
||||
|
||||
private DefaultAsyncQueryableExecuter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Task<int> CountAsync<T>(IQueryable<T> queryable)
|
||||
{
|
||||
return Task.FromResult(queryable.Count());
|
||||
}
|
||||
|
||||
public Task<List<T>> ToListAsync<T>(IQueryable<T> queryable)
|
||||
{
|
||||
return Task.FromResult(queryable.ToList());
|
||||
}
|
||||
|
||||
public Task<T> FirstOrDefaultAsync<T>(IQueryable<T> queryable)
|
||||
{
|
||||
return Task.FromResult(queryable.FirstOrDefault());
|
||||
}
|
||||
|
||||
public Task<T> FirstOrDefaultAsync<T>(IQueryable<T> queryable, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult(queryable.FirstOrDefault());
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue