using Serilog; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; namespace Wood.Util { public class PagedResult { public List Items { get; set; } public int TotalItems { get; set; } public int PageNumber { get; set; } public int PageSize { get; set; } public int TotalPages => (int)Math.Ceiling(TotalItems / (double)PageSize); public bool HasPreviousPage => PageNumber > 1; public bool HasNextPage => PageNumber < TotalPages; public PagedResult() { Items = new List(); } } public static class QueryableExtensions { public static PagedResult ToPagedResult(this IQueryable query, int pageNumber, int pageSize) { var result = new PagedResult { PageNumber = pageNumber, PageSize = pageSize, TotalItems = query.Count() }; result.Items = query .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToList(); return result; } public static IQueryable ApplySorting(this IQueryable query, string sortField, string sortDirection) { if (string.IsNullOrEmpty(sortField)) return query; var parameter = Expression.Parameter(typeof(T), "x"); var property = Expression.Property(parameter, sortField); var lambda = Expression.Lambda(property, parameter); string methodName = sortDirection?.ToLower() == "desc" ? "OrderByDescending" : "OrderBy"; var resultExpression = Expression.Call( typeof(Queryable), methodName, new[] { typeof(T), property.Type }, query.Expression, Expression.Quote(lambda)); return query.Provider.CreateQuery(resultExpression); } } }