using System.Linq; using System.Linq.Expressions; using System.Reflection; namespace LCU.API.Internal.Operations.IncentiveApiLib.Extensions; public static class EntityFrameworkExtensions { public static IOrderedQueryable OrderBy(this IQueryable query, string propertyName) { var entityType = typeof(TSource); var propertyInfo = entityType.GetProperty(propertyName); ParameterExpression arg = Expression.Parameter(entityType, "x"); MemberExpression property = Expression.Property(arg, propertyName); var selector = Expression.Lambda(property, new ParameterExpression[] { arg }); var enumarableType = typeof(System.Linq.Queryable); var method = enumarableType.GetMethods() .Where(m => m.Name == "OrderBy" && m.IsGenericMethodDefinition) .Where(m => { var parameters = m.GetParameters().ToList(); return parameters.Count == 2; }).Single(); MethodInfo genericMethod = method.MakeGenericMethod(entityType, propertyInfo.PropertyType); var newQuery = (IOrderedQueryable)genericMethod.Invoke(genericMethod, new object[] { query, selector }); return newQuery; } public static IOrderedQueryable OrderByDescending(this IQueryable query, string propertyName) { var entityType = typeof(TSource); var propertyInfo = entityType.GetProperty(propertyName); ParameterExpression arg = Expression.Parameter(entityType, "x"); MemberExpression property = Expression.Property(arg, propertyName); var selector = Expression.Lambda(property, new ParameterExpression[] { arg }); var enumarableType = typeof(System.Linq.Queryable); var method = enumarableType.GetMethods() .Where(m => m.Name == "OrderByDescending" && m.IsGenericMethodDefinition) .Where(m => { var parameters = m.GetParameters().ToList(); return parameters.Count == 2; }).Single(); MethodInfo genericMethod = method.MakeGenericMethod(entityType, propertyInfo.PropertyType); var newQuery = (IOrderedQueryable)genericMethod.Invoke(genericMethod, new object[] { query, selector }); return newQuery; } }