-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added IProjectionRepository and RepositoryWithMapper. (#21)
- Loading branch information
Showing
7 changed files
with
82 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
67 changes: 67 additions & 0 deletions
67
src/QuerySpecification.EntityFrameworkCore/RepositoryWithMapper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
namespace Pozitron.QuerySpecification; | ||
|
||
public abstract class RepositoryWithMapper<T> : RepositoryBase<T>, IProjectionRepository<T> where T : class | ||
{ | ||
private readonly PaginationSettings _paginationSettings = PaginationSettings.Default; | ||
|
||
protected RepositoryWithMapper(DbContext dbContext) | ||
: base(dbContext) | ||
{ | ||
} | ||
protected RepositoryWithMapper(DbContext dbContext, SpecificationEvaluator specificationEvaluator) | ||
: base(dbContext, specificationEvaluator) | ||
{ | ||
} | ||
protected RepositoryWithMapper(DbContext dbContext, PaginationSettings paginationSettings) | ||
: base(dbContext) | ||
{ | ||
_paginationSettings = paginationSettings; | ||
} | ||
protected RepositoryWithMapper(DbContext dbContext, SpecificationEvaluator specificationEvaluator, PaginationSettings paginationSettings) | ||
: base(dbContext, specificationEvaluator) | ||
{ | ||
_paginationSettings = paginationSettings; | ||
} | ||
|
||
protected abstract IQueryable<TResult> Map<TResult>(IQueryable<T> source); | ||
|
||
public virtual async Task<TResult> ProjectToFirstAsync<TResult>(Specification<T> specification, CancellationToken cancellationToken = default) | ||
{ | ||
var query = GenerateQuery(specification).AsNoTracking(); | ||
|
||
var projectedQuery = Map<TResult>(query); | ||
|
||
var result = await projectedQuery.FirstOrDefaultAsync(cancellationToken); | ||
|
||
return result ?? throw new EntityNotFoundException(typeof(T).Name); | ||
} | ||
public virtual async Task<TResult?> ProjectToFirstOrDefaultAsync<TResult>(Specification<T> specification, CancellationToken cancellationToken = default) | ||
{ | ||
var query = GenerateQuery(specification).AsNoTracking(); | ||
|
||
var projectedQuery = Map<TResult>(query); | ||
|
||
return await projectedQuery.FirstOrDefaultAsync(cancellationToken); | ||
} | ||
public virtual async Task<List<TResult>> ProjectToListAsync<TResult>(Specification<T> specification, CancellationToken cancellationToken = default) | ||
{ | ||
var query = GenerateQuery(specification).AsNoTracking(); | ||
|
||
var projectedQuery = Map<TResult>(query); | ||
|
||
return await projectedQuery.ToListAsync(cancellationToken); | ||
} | ||
public virtual async Task<PagedResult<TResult>> ProjectToListAsync<TResult>(Specification<T> specification, PagingFilter filter, CancellationToken cancellationToken = default) | ||
{ | ||
var query = GenerateQuery(specification, true).AsNoTracking(); | ||
var projectedQuery = Map<TResult>(query); | ||
|
||
var count = await projectedQuery.CountAsync(cancellationToken); | ||
var pagination = new Pagination(_paginationSettings, count, filter); | ||
|
||
projectedQuery = projectedQuery.ApplyPaging(pagination); | ||
var data = await projectedQuery.ToListAsync(cancellationToken); | ||
|
||
return new PagedResult<TResult>(data, pagination); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
namespace Pozitron.QuerySpecification; | ||
|
||
public interface IProjectionRepository<T> where T : class | ||
{ | ||
Task<TResult> ProjectToFirstAsync<TResult>(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<TResult?> ProjectToFirstOrDefaultAsync<TResult>(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<List<TResult>> ProjectToListAsync<TResult>(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<PagedResult<TResult>> ProjectToListAsync<TResult>(Specification<T> specification, PagingFilter filter, CancellationToken cancellationToken = default); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,11 @@ | ||
namespace Pozitron.QuerySpecification; | ||
|
||
public interface IRepositoryBase<T> where T : class | ||
public interface IRepositoryBase<T> : IReadRepositoryBase<T> where T : class | ||
{ | ||
Task<T> AddAsync(T entity, CancellationToken cancellationToken = default); | ||
Task<IEnumerable<T>> AddRangeAsync(IEnumerable<T> entities, CancellationToken cancellationToken = default); | ||
Task UpdateAsync(T entity, CancellationToken cancellationToken = default); | ||
Task DeleteAsync(T entity, CancellationToken cancellationToken = default); | ||
Task DeleteRangeAsync(IEnumerable<T> entities, CancellationToken cancellationToken = default); | ||
Task<int> SaveChangesAsync(CancellationToken cancellationToken = default); | ||
|
||
ValueTask<T?> FindAsync<TId>(TId id, CancellationToken cancellationToken = default) where TId : notnull; | ||
Task<T> FirstAsync(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<TResult> FirstAsync<TResult>(Specification<T, TResult> specification, CancellationToken cancellationToken = default); | ||
Task<T?> FirstOrDefaultAsync(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<TResult?> FirstOrDefaultAsync<TResult>(Specification<T, TResult> specification, CancellationToken cancellationToken = default); | ||
Task<T?> SingleOrDefaultAsync(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<TResult?> SingleOrDefaultAsync<TResult>(Specification<T, TResult> specification, CancellationToken cancellationToken = default); | ||
Task<List<T>> ListAsync(CancellationToken cancellationToken = default); | ||
Task<List<T>> ListAsync(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<List<TResult>> ListAsync<TResult>(Specification<T, TResult> specification, CancellationToken cancellationToken = default); | ||
Task<int> CountAsync(CancellationToken cancellationToken = default); | ||
Task<int> CountAsync(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<int> CountAsync<TResult>(Specification<T, TResult> specification, CancellationToken cancellationToken = default); | ||
Task<bool> AnyAsync(CancellationToken cancellationToken = default); | ||
Task<bool> AnyAsync(Specification<T> specification, CancellationToken cancellationToken = default); | ||
Task<bool> AnyAsync<TResult>(Specification<T, TResult> specification, CancellationToken cancellationToken = default); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters