using Microsoft.EntityFrameworkCore;
using System.Linq.Expressions;
namespace Core.Blueprint.DAL.SQLServer
{
///
/// Defines the contract for a generic repository to manage entities in a SQL Server database.
///
/// The type of the entity managed by the repository. Must be a class.
/// The type of the database context used by the repository. Must inherit from .
public interface IEntityRepository
where TEntity : class
where TContext : DbContext
{
///
/// Retrieves all entities of type from the database.
///
/// A task representing the asynchronous operation, with a collection of entities as the result.
Task> GetAllAsync();
///
/// Retrieves all entities of type from the database that match a specified condition.
///
/// An expression to filter the entities.
/// A task representing the asynchronous operation, with a collection of matching entities as the result.
Task> GetByConditionAsync(Expression> predicate);
///
/// Retrieves a single entity of type by its identifier.
///
/// The identifier of the entity to retrieve.
/// A task representing the asynchronous operation, with the entity as the result, or null if not found.
Task GetByIdAsync(int id);
///
/// Retrieves the first entity of type that matches a specified condition, or null if no match is found.
///
/// An expression to filter the entities.
/// A task representing the asynchronous operation, with the matching entity as the result, or null if none match.
Task FirstOrDefaultAsync(Expression> predicate);
///
/// Adds a new entity of type to the database.
///
/// The entity to add.
/// A task representing the asynchronous operation.
Task AddAsync(TEntity entity);
///
/// Adds multiple entities of type to the database.
///
/// The collection of entities to add.
/// A task representing the asynchronous operation.
Task AddRangeAsync(IEnumerable entities);
///
/// Updates an existing entity of type in the database.
///
/// The entity to update.
/// The updated entity.
TEntity Update(TEntity entity);
///
/// Updates multiple entities of type in the database.
///
/// The collection of entities to update.
void UpdateRange(IEnumerable entities);
///
/// Deletes an entity of type from the database.
///
/// The entity to delete.
void Delete(TEntity entity);
///
/// Deletes multiple entities of type from the database.
///
/// The collection of entities to delete.
void DeleteRange(IEnumerable entities);
///
/// Determines whether any entities of type exist in the database that match a specified condition.
///
/// An expression to filter the entities.
/// A task representing the asynchronous operation, with a boolean result indicating whether any match exists.
Task AnyAsync(Expression> predicate);
///
/// Executes a raw SQL query and maps the result to entities of type .
///
/// The raw SQL query to execute.
/// Optional parameters for the SQL query.
/// A task representing the asynchronous operation, with a collection of entities as the result.
Task> ExecuteRawSqlAsync(string sql, params object[] parameters);
///
/// Counts the total number of entities of type in the database.
///
/// A task representing the asynchronous operation, with the count as the result.
Task CountAsync();
///
/// Saves all pending changes to the database.
///
/// A task representing the asynchronous operation.
Task SaveAsync();
}
}