using System.Linq.Dynamic.Core; using System.Reflection; using System.Text; namespace Server.Helpers; public class SortHelper : ISortHelper { public IQueryable ApplySort(IQueryable entities, string? orderByQueryString) { if (!entities.Any() || String.IsNullOrWhiteSpace(orderByQueryString)) { return entities; } var orderParams = orderByQueryString.Trim().Split(","); var propertyInfos = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); var orderQueryBuilder = new StringBuilder(); foreach (var param in orderParams) { if (string.IsNullOrWhiteSpace(param)) { continue; } var propertyFromQueryName = param[0] == '-' || param[0] == '+' ? param.Substring(1) : param; var objectProperty = propertyInfos.FirstOrDefault(pi => pi.Name.Equals(propertyFromQueryName, StringComparison.InvariantCultureIgnoreCase)); if (objectProperty == null) { continue; } var sortingOrder = param[0] == '-' ? "descending" : "ascending"; orderQueryBuilder.Append($"{objectProperty.Name} {sortingOrder}, "); } var orderQuery = orderQueryBuilder.ToString().TrimEnd(',', ' '); return entities.OrderBy(orderQuery); } }