diff --git a/DigitalData.Core.Abstraction.Application/DigitalData.Core.Abstraction.Application.csproj b/DigitalData.Core.Abstraction.Application/DigitalData.Core.Abstraction.Application.csproj index bdd0f55..5c57408 100644 --- a/DigitalData.Core.Abstraction.Application/DigitalData.Core.Abstraction.Application.csproj +++ b/DigitalData.Core.Abstraction.Application/DigitalData.Core.Abstraction.Application.csproj @@ -37,7 +37,7 @@ enable latest - + @@ -52,24 +52,28 @@ + + + + diff --git a/DigitalData.Core.Abstraction.Application/Repository/IRepository.cs b/DigitalData.Core.Abstraction.Application/Repository/IRepository.cs index 5433e71..6c40c12 100644 --- a/DigitalData.Core.Abstraction.Application/Repository/IRepository.cs +++ b/DigitalData.Core.Abstraction.Application/Repository/IRepository.cs @@ -1,4 +1,5 @@ using System.Linq.Expressions; +using Microsoft.EntityFrameworkCore.Query; #if NETFRAMEWORK using System; using System.Collections.Generic; @@ -8,11 +9,29 @@ using System.Linq; #endif namespace DigitalData.Core.Abstraction.Application.Repository -#if NET - ; -#elif NETFRAMEWORK +{ + public interface IRepository { +#if NET + public #endif + Task ExecuteQueryRawAsync([NotParameterized] string sql, IEnumerable parameters, CancellationToken cancel = default); + +#if NET + public +#endif + Task ExecuteQueryInterpolatedAsync(FormattableString sql, CancellationToken cancel = default); + +#if NET + public +#endif + int ExecuteQueryRaw([NotParameterized] string sql, params object[] parameters); + +#if NET + public +#endif + int ExecuteQueryInterpolated(FormattableString sql); + } public interface IRepository { @@ -44,6 +63,16 @@ namespace DigitalData.Core.Abstraction.Application.Repository #endif IQueryable Query { get; } +#if NET + public +#endif + IQueryable QueryRaw([NotParameterized] string sql, params object[] parameters); + +#if NET + public +#endif + IQueryable QueryInterpolated([NotParameterized] FormattableString sql); + #if NET public #endif @@ -108,6 +137,4 @@ namespace DigitalData.Core.Abstraction.Application.Repository IQueryable ReadOnly(); #endregion } -#if NETFRAMEWORK - } -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/DigitalData.Core.Infrastructure/DbRepository.cs b/DigitalData.Core.Infrastructure/DbRepository.cs index d5dd35c..b02f028 100644 --- a/DigitalData.Core.Infrastructure/DbRepository.cs +++ b/DigitalData.Core.Infrastructure/DbRepository.cs @@ -23,12 +23,22 @@ namespace DigitalData.Core.Infrastructure Context = context; } - public int ExecuteSqlRaw([NotParameterized] string sql, params object[] parameters) + public Task ExecuteQueryRawAsync([NotParameterized] string sql, IEnumerable parameters, CancellationToken cancel = default) + { + return Context.Database.ExecuteSqlRawAsync(sql, parameters, cancel); + } + + public Task ExecuteQueryInterpolatedAsync(FormattableString sql, CancellationToken cancel = default) + { + return Context.Database.ExecuteSqlInterpolatedAsync(sql, cancel); + } + + public int ExecuteQueryRaw([NotParameterized] string sql, params object[] parameters) { return Context.Database.ExecuteSqlRaw(sql, parameters); } - public int ExecuteSqlInterpolated(FormattableString sql) + public int ExecuteQueryInterpolated(FormattableString sql) { return Context.Database.ExecuteSqlInterpolated(sql); } @@ -57,11 +67,6 @@ namespace DigitalData.Core.Infrastructure Mapper = mapper; } - public IQueryable Sql([NotParameterized] string sql, params object[] parameters) - { - return Entities.FromSqlRaw(sql, parameters); - } - #region Create public virtual async Task CreateAsync(TEntity entity, CancellationToken cancel = default) { @@ -95,6 +100,10 @@ namespace DigitalData.Core.Infrastructure #region Read public virtual IQueryable Query => Entities.AsNoTracking(); + public IQueryable QueryRaw([NotParameterized] string sql, params object[] parameters) => Entities.FromSqlRaw(sql, parameters); + + public IQueryable QueryInterpolated([NotParameterized] FormattableString sql) => Entities.FromSqlInterpolated(sql); + public virtual IQueryable Where(Expression> expression) => Entities.AsNoTracking().Where(expression); public virtual IEnumerable GetAll() => Entities.AsNoTracking().ToList(); diff --git a/DigitalData.Core.Infrastructure/DependencyInjection.cs b/DigitalData.Core.Infrastructure/DependencyInjection.cs index 1acd7b9..d188058 100644 --- a/DigitalData.Core.Infrastructure/DependencyInjection.cs +++ b/DigitalData.Core.Infrastructure/DependencyInjection.cs @@ -40,6 +40,9 @@ public static class DependencyInjection // 3. register db set factories (can overwrite) private readonly Queue> RegsDbSetFactory = new Queue>(); + // 4. register repository + private readonly Queue> RegsRepository = new Queue>(); + internal void RegisterAllServices(IServiceCollection services) { // 1. register from assembly @@ -113,6 +116,11 @@ public static class DependencyInjection where TDbContext : DbContext where TEntity : class => RegsDbSetFactory.Enqueue(s => s.AddDbSetFactory(dbSetFactory)); + + public void RegisterDefaultRepository() + where TDbContext : DbContext + where TEntity : class + => RegsRepository.Enqueue(s => s.AddScoped, DbRepository>()); } private static void InvokeAll(this Queue> queue, T services)