DocSpace-client/common/ASC.Core.Common/EF/LinqExtensions.cs

48 lines
2.0 KiB
C#
Raw Normal View History

2022-02-15 11:52:43 +00:00
namespace ASC.Core.Common.EF;
public static class LinqExtensions
2019-12-11 14:30:28 +00:00
{
2022-02-15 11:52:43 +00:00
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string name, bool sortOrderAsc)
2019-12-11 14:30:28 +00:00
{
2022-02-15 11:52:43 +00:00
var propInfo = GetPropertyInfo(typeof(T), name);
var expr = GetOrderExpression(typeof(T), propInfo);
2019-12-11 14:30:28 +00:00
2022-02-15 11:52:43 +00:00
var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == (sortOrderAsc ? "OrderBy" : "OrderByDescending") && m.GetParameters().Length == 2);
var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
2022-02-15 11:52:43 +00:00
return (IOrderedQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
}
2019-12-11 14:30:28 +00:00
2022-02-15 11:52:43 +00:00
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> query, string name, bool sortOrderAsc)
{
var propInfo = GetPropertyInfo(typeof(T), name);
var expr = GetOrderExpression(typeof(T), propInfo);
2022-02-15 11:52:43 +00:00
var method = typeof(Queryable).GetMethods().FirstOrDefault(m => m.Name == (sortOrderAsc ? "ThenBy" : "ThenByDescending") && m.GetParameters().Length == 2);
var genericMethod = method.MakeGenericMethod(typeof(T), propInfo.PropertyType);
2022-02-15 11:52:43 +00:00
return (IOrderedQueryable<T>)genericMethod.Invoke(null, new object[] { query, expr });
}
2022-02-15 11:52:43 +00:00
private static PropertyInfo GetPropertyInfo(Type objType, string name)
{
var properties = objType.GetProperties();
var matchedProperty = properties.FirstOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
if (matchedProperty == null)
2019-12-11 14:30:28 +00:00
{
2022-02-15 11:52:43 +00:00
throw new ArgumentException(nameof(name));
2019-12-11 14:30:28 +00:00
}
2022-02-15 11:52:43 +00:00
return matchedProperty;
}
private static LambdaExpression GetOrderExpression(Type objType, PropertyInfo pi)
{
var paramExpr = Expression.Parameter(objType);
var propAccess = Expression.PropertyOrField(paramExpr, pi.Name);
var expr = Expression.Lambda(propAccess, paramExpr);
return expr;
2019-12-11 14:30:28 +00:00
}
}