57 lines
2.3 KiB
C#
57 lines
2.3 KiB
C#
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<TSource>(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<TSource>(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;
|
|
}
|
|
}
|