using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; namespace GamificationService.Database.GenericRepository; public class GenericRepository : IGenericRepository where TEntity : class { private readonly ApplicationContext _context; private readonly DbSet _dbSet; public GenericRepository(ApplicationContext context) { _context = context; _dbSet = context.Set(); } public virtual IQueryable Get( Expression>? filter = null, Func, IOrderedQueryable>? orderBy = null, params Expression>[] includes) { IQueryable query = _dbSet; if (filter != null) { query = query.Where(filter); } if (includes != null) { foreach (var include in includes) { query = query.Include(include); } } return orderBy != null ? orderBy(query) : query; } public virtual TEntity? GetById(object id) => _dbSet.Find(id); public virtual async Task GetByIdAsync(object id) => await _dbSet.FindAsync(id); public virtual void Add(TEntity entity) => _dbSet.Add(entity); public virtual void AddRange(IEnumerable entities) => _dbSet.AddRange(entities); public virtual async Task AddAsync(TEntity entity) => await _dbSet.AddAsync(entity); public virtual void Delete(object id) { var entity = _dbSet.Find(id); if (entity == null) { throw new KeyNotFoundException($"Entity of type {typeof(TEntity).Name} with id '{id}' was not found."); } Delete(entity); } public virtual void DeleteRange(IEnumerable entities) => _dbSet.RemoveRange(entities); public virtual void Delete(TEntity entity) { if (_context.Entry(entity).State == EntityState.Detached) { _dbSet.Attach(entity); } _dbSet.Remove(entity); } public virtual void Update(TEntity entity) { _dbSet.Update(entity); } }