using AipGateway.API.Domain.IRepositories.IGenericRepositories; using AipGateway.API.Infrastructure.Configurations; using AipGateway.API.Infrastructure.Persistence; using Microsoft.EntityFrameworkCore; using System.Linq.Expressions; namespace AipGateway.API.Infrastructure.DataAccess { public class GenericRepository : QueriesRepository, IGenericRepository where T : class { protected readonly ApplicationDbContext _context; public GenericRepository(ApplicationDbContext context, ConnectionInfo connectionInfo) : base(context, connectionInfo) { _context = context; } public async Task GetAsync(int id) { return await _context.Set().FindAsync(id); } public async Task GetByString(string id) { return await _context.Set().FindAsync(id); } public async Task> GetAllAsync(params Expression>[] includes) { var query = _context.Set().AsQueryable(); if (includes != null && includes.Length > 0) { foreach (var include in includes) { query = query.Include(include); } } return await query.ToListAsync(); } public IQueryable GetAllQueryable() { return _context.Set().AsQueryable(); } public async Task AddAsync(T entity) { await _context.Set().AddAsync(entity); } public void Add(T entity) { _context.Set().Add(entity); } public async Task AddRangeAsync(IEnumerable entity) { await _context.Set().AddRangeAsync(entity); } public async Task> GetWhereAsync(Expression> predicate, params Expression>[] includes) { var query = _context.Set().AsQueryable(); if (includes != null && includes.Length > 0) { foreach (var include in includes) { query = query.Include(include); } } return await query.Where(predicate).ToListAsync(); } public async Task GetFirstOrDefaultAsync(Expression> predicate) { return await _context.Set().FirstOrDefaultAsync(predicate); } public async Task GetFirstOrDefaultAsync(Expression> predicate, params Expression>[] includes) { var query = _context.Set().AsQueryable(); if (includes != null && includes.Length > 0) { foreach (var include in includes) { query = query.Include(include); } } return await query.FirstOrDefaultAsync(predicate) ?? default; } public async Task ExistsAsync(Expression> predicate) { return await _context.Set().AnyAsync(predicate); } public void Delete(T entity) { _context.Set().Remove(entity); } public void DeleteRange(IEnumerable entities) { _context.Set().RemoveRange(entities); } public void Update(T entity) { _context.Set().Update(entity); } public IEnumerable ExecWithStoreProcedure(string query, params object[] parameters) { return _context.Set().FromSqlRaw(query, parameters).ToList(); } } }