46 lines
1.4 KiB
C#
46 lines
1.4 KiB
C#
using System.Linq.Dynamic.Core;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
|
|
namespace Server.Helpers;
|
|
|
|
public class SortHelper<T> : ISortHelper<T>
|
|
{
|
|
public IQueryable<T> ApplySort(IQueryable<T> 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);
|
|
}
|
|
} |