using Microsoft.EntityFrameworkCore; using System.Linq.Expressions; namespace Core.Blueprint.DAL.SQLServer { /// /// The class provides a comprehensive generic repository /// for managing entities using Entity Framework Core with SQL Server as the underlying database. /// Designed as a package for consumption by external applications. /// /// The entity type managed by the repository. Must be a class. /// The database context type. Must inherit from . public class EntityRepository : IEntityRepository where TEntity : class where TContext : DbContext { private readonly TContext _context; private readonly DbSet _dbSet; /// /// Initializes a new instance of the class with a specified database context. /// /// The for database operations. public EntityRepository(TContext context) { _context = context; _dbSet = _context.Set(); } /// /// Retrieves all entities of type from the database. /// /// A task representing the asynchronous operation, with a list of entities as the result. public async Task> GetAllAsync() { return await _dbSet.ToListAsync(); } /// /// Retrieves all entities of type from the database that match a specified filter. /// /// An expression to filter entities. /// A task representing the asynchronous operation, with a list of filtered entities as the result. public async Task> GetByConditionAsync(Expression> predicate) { return await _dbSet.Where(predicate).ToListAsync(); } /// /// Retrieves a single entity of type by its identifier. /// /// The identifier of the entity. /// A task representing the asynchronous operation, with the entity as the result, or null if not found. public async Task GetByIdAsync(int id) { var existingEntity = await _dbSet.FindAsync(id); if (existingEntity != null) { _context.Entry(existingEntity).State = EntityState.Detached; } return existingEntity; } /// /// Adds a new entity to the database. /// /// The entity to add. /// A task representing the asynchronous operation. public async Task AddAsync(TEntity entity) { await _dbSet.AddAsync(entity); } /// /// Adds multiple entities to the database. /// /// The collection of entities to add. /// A task representing the asynchronous operation. public async Task AddRangeAsync(IEnumerable entities) { await _dbSet.AddRangeAsync(entities); } /// /// Updates an existing entity in the database. /// /// The entity to update. /// The updated entity. public TEntity Update(TEntity entity) { _dbSet.Attach(entity); _context.Entry(entity).State = EntityState.Modified; return entity; } /// /// Updates multiple entities in the database. /// /// The collection of entities to update. public void UpdateRange(IEnumerable entities) { foreach (var entity in entities) { _dbSet.Attach(entity); _context.Entry(entity).State = EntityState.Modified; } } /// /// Deletes an entity from the database. /// /// The entity to delete. public void Delete(TEntity entity) { if (_context.Entry(entity).State == EntityState.Detached) { _dbSet.Attach(entity); } _dbSet.Remove(entity); } /// /// Deletes multiple entities from the database. /// /// The collection of entities to delete. public void DeleteRange(IEnumerable entities) { _dbSet.RemoveRange(entities); } /// /// Retrieves the first entity matching the specified condition or null if no match is found. /// /// An expression to filter entities. /// A task representing the asynchronous operation, with the matched entity as the result. public async Task FirstOrDefaultAsync(Expression> predicate) { return await _dbSet.FirstOrDefaultAsync(predicate); } /// /// Determines if any entities exist that match the specified condition. /// /// An expression to filter entities. /// A task representing the asynchronous operation, with a boolean result indicating existence. public async Task AnyAsync(Expression> predicate) { return await _dbSet.AnyAsync(predicate); } /// /// Saves all pending changes to the database. /// /// A task representing the asynchronous operation. public async Task SaveAsync() { await _context.SaveChangesAsync(); } /// /// Executes a raw SQL query and maps the result to the specified entity type. /// /// The raw SQL query. /// Optional parameters for the query. /// An representing the result set. public async Task> ExecuteRawSqlAsync(string sql, params object[] parameters) { return await _dbSet.FromSqlRaw(sql, parameters).ToListAsync(); } /// /// Counts the total number of entities in the database. /// /// A task representing the asynchronous operation, with the count as the result. public async Task CountAsync() { return await _dbSet.CountAsync(); } } }