using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; using MyNewProjectName.Domain.Common; using MyNewProjectName.Domain.Interfaces; using MyNewProjectName.Infrastructure.Persistence.Context; namespace MyNewProjectName.Infrastructure.Persistence.Repositories; /// /// Generic repository implementation /// public class Repository : IRepository where T : BaseEntity { protected readonly ApplicationDbContext _context; protected readonly DbSet _dbSet; public Repository(ApplicationDbContext context) { _context = context; _dbSet = context.Set(); } public virtual async Task GetByIdAsync(Guid id, CancellationToken cancellationToken = default) { return await _dbSet.FindAsync(new object[] { id }, cancellationToken); } public virtual async Task> GetAllAsync(CancellationToken cancellationToken = default) { return await _dbSet.ToListAsync(cancellationToken); } public virtual async Task> FindAsync(Expression> predicate, CancellationToken cancellationToken = default) { return await _dbSet.Where(predicate).ToListAsync(cancellationToken); } public virtual async Task FirstOrDefaultAsync(Expression> predicate, CancellationToken cancellationToken = default) { return await _dbSet.FirstOrDefaultAsync(predicate, cancellationToken); } public virtual async Task AnyAsync(Expression> predicate, CancellationToken cancellationToken = default) { return await _dbSet.AnyAsync(predicate, cancellationToken); } public virtual async Task CountAsync(Expression>? predicate = null, CancellationToken cancellationToken = default) { if (predicate == null) return await _dbSet.CountAsync(cancellationToken); return await _dbSet.CountAsync(predicate, cancellationToken); } public virtual async Task AddAsync(T entity, CancellationToken cancellationToken = default) { await _dbSet.AddAsync(entity, cancellationToken); } public virtual async Task AddRangeAsync(IEnumerable entities, CancellationToken cancellationToken = default) { await _dbSet.AddRangeAsync(entities, cancellationToken); } public virtual void Update(T entity) { _dbSet.Attach(entity); _context.Entry(entity).State = EntityState.Modified; } public virtual void UpdateRange(IEnumerable entities) { _dbSet.AttachRange(entities); foreach (var entity in entities) { _context.Entry(entity).State = EntityState.Modified; } } public virtual void Remove(T entity) { _dbSet.Remove(entity); } public virtual void RemoveRange(IEnumerable entities) { _dbSet.RemoveRange(entities); } }