57 lines
1.6 KiB
C#
57 lines
1.6 KiB
C#
using DD.Persistence.Database.EntityAbstractions;
|
||
using DD.Persistence.Extensions;
|
||
using DD.Persistence.Models.Common;
|
||
using DD.Persistence.Models.Requests;
|
||
using Microsoft.EntityFrameworkCore;
|
||
|
||
namespace DD.Persistence.Database.Postgres.Helpers;
|
||
|
||
/// <summary>
|
||
/// класс с набором методов, необходимых для фильтрации записей
|
||
/// </summary>
|
||
public static class QueryBuilders
|
||
{
|
||
public static IQueryable<TEntity> Apply<TEntity>(this IQueryable<TEntity> query, DateTimeOffset momentUtc)
|
||
where TEntity : class, IChangeLog
|
||
{
|
||
momentUtc = momentUtc.ToUniversalTime();
|
||
|
||
query = query
|
||
.Where(e => e.Creation <= momentUtc)
|
||
.Where(e => e.Obsolete == null || e.Obsolete >= momentUtc);
|
||
|
||
return query;
|
||
}
|
||
|
||
|
||
public static async Task<PaginationContainer<TDto>> ApplyPagination<TEntity, TDto>(
|
||
this IQueryable<TEntity> query,
|
||
PaginationRequest request,
|
||
Func<TEntity, TDto> Convert,
|
||
CancellationToken token)
|
||
where TEntity : class
|
||
where TDto : class
|
||
{
|
||
if (!String.IsNullOrEmpty(request.SortSettings))
|
||
{
|
||
query = query.SortBy(request.SortSettings);
|
||
}
|
||
|
||
var entities = await query
|
||
.Skip(request.Skip)
|
||
.Take(request.Take)
|
||
.ToArrayAsync(token);
|
||
|
||
var count = await query.CountAsync(token);
|
||
var items = entities.Select(Convert);
|
||
var result = new PaginationContainer<TDto>
|
||
{
|
||
Skip = request.Skip,
|
||
Take = request.Take,
|
||
Items = items,
|
||
Count = count
|
||
};
|
||
|
||
return result;
|
||
}
|
||
} |