using System.Linq.Dynamic.Core; using CMSMicroservice.Domain.Common; namespace CMSMicroservice.Application.Common.Extensions; public static class SortByExtensions { public static IQueryable ApplyOrder(this IQueryable source, string? sortBy) where TSource : BaseAuditableEntity { if (sortBy is null or "") { return source.OrderByDescending(p => p.Created); } return source.OrderBy(NormalizeSortBy(sortBy)); } /// /// Dynamic LINQ treats "-Created" as unary minus on DateTime (invalid). /// Project convention: leading '-' means descending sort. /// private static string NormalizeSortBy(string sortBy) { sortBy = sortBy.Trim(); if (sortBy.StartsWith('-') && sortBy.Length > 1) { return $"{sortBy[1..]} descending"; } if (sortBy.StartsWith('+') && sortBy.Length > 1) { return $"{sortBy[1..]} ascending"; } return sortBy; } }