using Microsoft.EntityFrameworkCore; using Persistence.Database.Model; using Persistence.Models; using Persistence.Models.Requests; namespace Persistence.Repository; /// /// класс с набором методов, необходимых для фильтрации записей /// public static class QueryBuilders { public static IQueryable Apply(this IQueryable query, SectionPartRequest request) where TEntity : class, IWithSectionPart { if (request.IdSection.HasValue) { query = query.Where(e => e.IdSection == request.IdSection); } if (request.DepthStart.HasValue) { query = query.Where(e => e.DepthStart >= request.DepthStart); } if (request.DepthEnd.HasValue) { query = query.Where(e => e.DepthEnd <= request.DepthEnd); } return query; } public static IQueryable Apply(this IQueryable 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> ApplyPagination( this IQueryable query, PaginationRequest request, Func Convert, CancellationToken token) where TEntity : class, IWithSectionPart where TDto : class { if (String.IsNullOrEmpty(request.SortSettings)) { query = query .OrderBy(e => e.IdSection) .ThenBy(e => e.DepthStart) .ThenBy(e => e.DepthEnd); } else { 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 { Skip = request.Skip, Take = request.Take, Items = items, Count = count }; return result; } }