public abstract class RepositoryBase<TEntity, TCreateUpdateQuery> where TEntity : class, new()
{
private readonly AppContext context;
private DbSet<TEntity> dbEntities { get; }
protected RepositoryBase(BourseContext context)
{
this.context = context ?? throw new ArgumentNullException(nameof(context));
dbEntities = this.context.Set<TEntity>();
}
protected async Task<IReadOnlyCollection<TResult>> GetAsync<TResult>(
Expression<Func<TEntity, TResult>> selector,
Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>>? include = null,
Expression<Func<TEntity, bool>>? predicate = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>>? orderBy = null,
Func<IQueryable<TEntity>, IQueryable<TEntity>>? skipTake = null,
bool disableTracking = true,
CancellationToken cancellationToken = default)
where TResult : class
{
IQueryable<TEntity> query = dbEntities;
if (include is not null)
{
query = include(query);
}
if (predicate is not null)
{
query = query.Where(predicate);
}
if (orderBy is not null)
{
query = orderBy(query);
}
if (skipTake is not null)
{
query = skipTake(query);
}
if (disableTracking)
{
query = query.AsNoTracking();
}
return await query.Select(selector).ToListAsync(cancellationToken);
}
public async Task<TEntity> CreateAsync(
TEntity entity, CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(entity);
await context.AddAsync(entity, cancellationToken);
await context.SaveChangesAsync(cancellationToken);
return entity;
}
public async Task<bool> UpdateAsync(
Expression<Func<TEntity, bool>> filterByIdExpression,
TCreateUpdateQuery query,
CancellationToken cancellationToken)
{
ArgumentNullException.ThrowIfNull(query);
var entityToUpdate = await dbEntities
.FirstOrDefaultAsync(filterByIdExpression, cancellationToken);
if (entityToUpdate is null)
{
return false;
}
UpdateEntityFromCreateUpdateQuery(query, entityToUpdate);
await context.SaveChangesAsync(cancellationToken);
return true;
}
public async Task<bool> DeleteAsync(
Expression<Func<TEntity, bool>> filterByIdExpression,
CancellationToken cancellationToken)
{
var nbAffectedRows = await dbEntities
.Where(filterByIdExpression)
.ExecuteDeleteAsync(cancellationToken);
return nbAffectedRows > 0;
}
}
|