From 7a1705365bc643f9ae6b10050c81ae60ded50a82 Mon Sep 17 00:00:00 2001 From: TekH Date: Tue, 24 Mar 2026 09:42:59 +0100 Subject: [PATCH] Add dynamic SQL execution to IRecDbContext interface Added Database property to IRecDbContext for database operations. Introduced ExecuteDynamicSqlAsync extension method to run arbitrary SQL and return results as JSON. This enables flexible querying and result serialization. --- .../Common/Interfaces/IRecDbContext.cs | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) 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