diff --git a/src/ReC.Application/Common/Interfaces/IRecDbContext.cs b/src/ReC.Application/Common/Interfaces/IRecDbContext.cs index 3287bbb..44585f7 100644 --- a/src/ReC.Application/Common/Interfaces/IRecDbContext.cs +++ b/src/ReC.Application/Common/Interfaces/IRecDbContext.cs @@ -1,6 +1,8 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; using ReC.Domain.QueryOutput; using ReC.Domain.Views; +using System.Text.Json; namespace ReC.Application.Common.Interfaces; @@ -21,4 +23,38 @@ public interface IRecDbContext #endregion DbSets public Task SaveChangesAsync(CancellationToken cancel = default); + + public DatabaseFacade Database { get; } +} + +public static class RecDbContextSaveExtensions +{ + public static async Task ExecuteDynamicSqlAsync(this IRecDbContext context, string sql) + { + var result = new List>(); + + using var command = context.Database.GetDbConnection().CreateCommand(); + + command.CommandText = sql; + + await context.Database.OpenConnectionAsync(); + + using var reader = await command.ExecuteReaderAsync(); + while (await reader.ReadAsync()) + { + var row = new Dictionary(); + + for (int i = 0; i < reader.FieldCount; i++) + { + var columnName = reader.GetName(i); + var value = reader.IsDBNull(i) ? null : reader.GetValue(i); + + row[columnName] = value; + } + + result.Add(row); + } + + return JsonSerializer.Serialize(result); + } } \ No newline at end of file