refactor: Vereinfachung der SQLExecutor-Implementierung zur Rückgabe von IQueryExecutor
- Aktualisiert `SQLExecutor<T>` um `ISQLExecutor<T>` zu implementieren und `IQueryExecutor<T>` für die weitere Abfrageausführung zurückzugeben. - Umstrukturierte Methoden zur Verwendung von `ToExecutor()` für die Konvertierung von rohen SQL-Abfragen in einen `IQueryExecutor<T>`. - Geänderter Konstruktor, um `IServiceProvider` für die Injektion von Abhängigkeiten von benutzerdefinierten SQL-Abfrageklassen zu akzeptieren.
This commit is contained in:
@@ -1,34 +1,42 @@
|
||||
using EnvelopeGenerator.Application.Contracts.SQLExecutor;
|
||||
using AngleSharp.Dom;
|
||||
using EnvelopeGenerator.Application.Contracts.SQLExecutor;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace EnvelopeGenerator.Infrastructure;
|
||||
|
||||
public record QueryExecutor<TEntity>(IQueryable<TEntity> Queryable) : IQueryExecutor<TEntity>
|
||||
public sealed record QueryExecutor<TEntity> : IQueryExecutor<TEntity>
|
||||
{
|
||||
public TEntity First() => Queryable.First();
|
||||
private readonly IQueryable<TEntity> _query;
|
||||
|
||||
public Task<TEntity> FirstAsync() => Queryable.FirstAsync();
|
||||
internal QueryExecutor(IQueryable<TEntity> queryable)
|
||||
{
|
||||
_query = queryable;
|
||||
}
|
||||
|
||||
public TEntity? FirstOrDefault() => Queryable.FirstOrDefault();
|
||||
public TEntity First() => _query.First();
|
||||
|
||||
public Task<TEntity> FirstAsync() => _query.FirstAsync();
|
||||
|
||||
public TEntity? FirstOrDefault() => _query.FirstOrDefault();
|
||||
|
||||
|
||||
public Task<TEntity?> FirstOrDefaultAsync() => Queryable.FirstOrDefaultAsync();
|
||||
public Task<TEntity?> FirstOrDefaultAsync() => _query.FirstOrDefaultAsync();
|
||||
|
||||
|
||||
public TEntity Single() => Queryable.Single();
|
||||
public TEntity Single() => _query.Single();
|
||||
|
||||
|
||||
public Task<TEntity> SingleAsync() => Queryable.SingleAsync();
|
||||
public Task<TEntity> SingleAsync() => _query.SingleAsync();
|
||||
|
||||
|
||||
public TEntity? SingleOrDefault() => Queryable.SingleOrDefault();
|
||||
public TEntity? SingleOrDefault() => _query.SingleOrDefault();
|
||||
|
||||
|
||||
public Task<TEntity?> SingleOrDefaultAsync() => Queryable.SingleOrDefaultAsync();
|
||||
public Task<TEntity?> SingleOrDefaultAsync() => _query.SingleOrDefaultAsync();
|
||||
|
||||
|
||||
public IEnumerable<TEntity> ToList() => Queryable.ToList();
|
||||
public IEnumerable<TEntity> ToList() => _query.ToList();
|
||||
|
||||
|
||||
public async Task<IEnumerable<TEntity>> ToListAsync() => await Queryable.ToListAsync();
|
||||
}
|
||||
public async Task<IEnumerable<TEntity>> ToListAsync() => await _query.ToListAsync();
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace EnvelopeGenerator.Infrastructure;
|
||||
|
||||
public static class QueryExecutorExtension
|
||||
{
|
||||
public static QueryExecutor<TEntity> ToExecutor<TEntity>(this IQueryable<TEntity> queryable) where TEntity : class
|
||||
{
|
||||
return new QueryExecutor<TEntity>(queryable);
|
||||
}
|
||||
}
|
||||
@@ -10,44 +10,21 @@ public sealed class SQLExecutor<T> : ISQLExecutor<T> where T : class
|
||||
|
||||
private readonly IServiceProvider _provider;
|
||||
|
||||
public SQLExecutor(EGDbContext context)
|
||||
public SQLExecutor(EGDbContext context, IServiceProvider provider)
|
||||
{
|
||||
_context = context;
|
||||
_provider = provider;
|
||||
}
|
||||
|
||||
public async Task<T?> ExecuteFirstAsync(string sql, CancellationToken cancellation = default, params object[] parameters)
|
||||
=> await _context
|
||||
.Set<T>()
|
||||
.FromSqlRaw(sql, parameters)
|
||||
.FirstOrDefaultAsync(cancellation);
|
||||
public IQueryExecutor<T> Execute(string sql, CancellationToken cancellation = default, params object[] parameters)
|
||||
=> _context
|
||||
.Set<T>()
|
||||
.FromSqlRaw(sql, parameters)
|
||||
.ToExecutor();
|
||||
|
||||
public async Task<T?> ExecuteSingleAsync(string sql, CancellationToken cancellation = default, params object[] parameters)
|
||||
=> await _context
|
||||
.Set<T>()
|
||||
.FromSqlRaw(sql, parameters)
|
||||
.SingleOrDefaultAsync(cancellation);
|
||||
|
||||
public async Task<IEnumerable<T>> ExecuteAllAsync(string sql, CancellationToken cancellation = default, params object[] parameters)
|
||||
=> await _context
|
||||
.Set<T>()
|
||||
.FromSqlRaw(sql, parameters)
|
||||
.ToListAsync(cancellation);
|
||||
|
||||
public Task<T?> ExecuteFirstAsync<TSQL>(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL<T>
|
||||
public IQueryExecutor<T> Execute<TSQL>(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL<T>
|
||||
{
|
||||
var sql = _provider.GetRequiredService<TSQL>();
|
||||
return ExecuteFirstAsync(sql.Raw);
|
||||
}
|
||||
|
||||
public Task<T?> ExecuteSingleAsync<TSQL>(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL<T>
|
||||
{
|
||||
var sql = _provider.GetRequiredService<TSQL>();
|
||||
return ExecuteSingleAsync(sql.Raw);
|
||||
}
|
||||
|
||||
public Task<IEnumerable<T>> ExecuteAllAsync<TSQL>(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL<T>
|
||||
{
|
||||
var sql = _provider.GetRequiredService<TSQL>();
|
||||
return ExecuteAllAsync(sql.Raw);
|
||||
return Execute(sql.Raw);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user