using EnvelopeGenerator.Application.Contracts.SQLExecutor; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace EnvelopeGenerator.Infrastructure; public sealed class SQLExecutor : ISQLExecutor where T : class { private readonly EGDbContext _context; private readonly IServiceProvider _provider; public SQLExecutor(EGDbContext context) { _context = context; } public async Task ExecuteFirstAsync(string sql, CancellationToken cancellation = default, params object[] parameters) => await _context .Set() .FromSqlRaw(sql, parameters) .FirstOrDefaultAsync(cancellation); public async Task ExecuteSingleAsync(string sql, CancellationToken cancellation = default, params object[] parameters) => await _context .Set() .FromSqlRaw(sql, parameters) .SingleOrDefaultAsync(cancellation); public async Task> ExecuteAllAsync(string sql, CancellationToken cancellation = default, params object[] parameters) => await _context .Set() .FromSqlRaw(sql, parameters) .ToListAsync(cancellation); public Task ExecuteFirstAsync(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL { var sql = _provider.GetRequiredService(); return ExecuteFirstAsync(sql.Raw); } public Task ExecuteSingleAsync(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL { var sql = _provider.GetRequiredService(); return ExecuteSingleAsync(sql.Raw); } public Task> ExecuteAllAsync(CancellationToken cancellation = default, params object[] parameters) where TSQL : ISQL { var sql = _provider.GetRequiredService(); return ExecuteAllAsync(sql.Raw); } }