using Dapper; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage; using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; namespace VOL.Core.BaseProvider { public static class RepositoryBaseSqlExtensions { private static IDbConnection DbConnection(this IRepositoryDbContext repository) { return repository.DbContext.Database.GetDbConnection(); } private static IDbTransaction DbContextTransaction(this IRepositoryDbContext repository) { return repository.DbContext.Database.CurrentTransaction?.GetDbTransaction(); } public static List QueryList(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return repository.DbConnection().Query(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout) .ToList(); } public static async Task> QueryListAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return await repository.DbConnection().QueryAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static async Task QueryFirstAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) where T : class { return await repository.DbConnection().QueryFirstOrDefaultAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static T QueryFirst(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) where T : class { return repository.DbConnection().QueryFirstOrDefault(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static async Task QueryDynamicFirstAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return await repository.DbConnection().QueryFirstOrDefaultAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static dynamic QueryDynamicFirst(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return repository.DbConnection().QueryFirstOrDefault(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static async Task QueryDynamicListAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return await repository.DbConnection().QueryAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static List QueryDynamicList(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return repository.DbConnection().Query(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout).ToList(); } public static async Task ExecuteScalarAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return await repository.DbConnection().ExecuteScalarAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static object ExecuteScalar(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return repository.DbConnection().ExecuteScalar(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static async Task ExcuteNonQueryAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return await repository.DbConnection().ExecuteAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static int ExcuteNonQuery(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { return repository.DbConnection().Execute(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); } public static async Task<(IEnumerable, IEnumerable)> QueryMultipleAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (await reader.ReadAsync(), await reader.ReadAsync()); } public static (List, List) QueryMultiple(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (reader.Read().ToList(), reader.Read().ToList()); } public static async Task<(IEnumerable, IEnumerable)> QueryDynamicMultipleAsync(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using (SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout)) { return (await reader.ReadAsync(), await reader.ReadAsync()); } } public static (List, List) QueryDynamicMultiple(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (reader.Read().ToList(), reader.Read().ToList()); } public static async Task<(IEnumerable, IEnumerable, IEnumerable)> QueryMultipleAsync( this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync()); } public static (List, List, List) QueryMultiple(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList()); } public static async Task<(IEnumerable, IEnumerable)> QueryDynamicMultipleAsync2(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (await reader.ReadAsync(), await reader.ReadAsync()); } public static (List, List) QueryDynamicMultiple2(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (reader.Read().ToList(), reader.Read().ToList()); } public static async Task<(IEnumerable, IEnumerable, IEnumerable)> QueryDynamicMultipleAsync3( this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync()); } public static (List, List, List) QueryDynamicMultiple3(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return (reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList()); } public static async Task<(IEnumerable, IEnumerable, IEnumerable, IEnumerable, IEnumerable)> QueryDynamicMultipleAsync5( this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return ( await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync() ); } public static (List, List, List, List, List) QueryDynamicMultiple5( this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return ( reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList() ); } public static async Task<(IEnumerable, IEnumerable, IEnumerable, IEnumerable)> QueryMultipleAsync( this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return ( await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync() ); } public static (List, List, List, List) QueryMultiple(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return ( reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList() ); } public static async Task<(IEnumerable, IEnumerable, IEnumerable, IEnumerable, IEnumerable)> QueryMultipleAsync( this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = await repository.DbConnection().QueryMultipleAsync(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return ( await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync(), await reader.ReadAsync() ); } public static (List, List, List, List, List) QueryMultiple(this IRepositoryDbContext repository, string sql, object param = null, CommandType? commandType = null, int? timeout = null) { using SqlMapper.GridReader reader = repository.DbConnection().QueryMultiple(sql, param, transaction: repository.DbContextTransaction(), commandType: commandType, commandTimeout: timeout); return ( reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList(), reader.Read().ToList() ); } } }