58 lines
2.5 KiB
C#
58 lines
2.5 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Linq.Expressions;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Diagnostics.Contracts;
|
|||
|
|
namespace APT.Infrastructure.Core
|
|||
|
|
{
|
|||
|
|
public static class QueryableOrderExtension
|
|||
|
|
{
|
|||
|
|
public static IQueryable<T> SetQueryableOrder<T>(this IQueryable<T> query, string sort, string order, bool isThen = false)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(sort))
|
|||
|
|
throw new Exception("必须指定排序字段!");
|
|||
|
|
|
|||
|
|
//PropertyInfo sortProperty = typeof(T).GetProperty(sort, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
|
|||
|
|
//if (sortProperty == null)
|
|||
|
|
// throw new Exception("查询对象中不存在排序字段" + sort + "!");
|
|||
|
|
|
|||
|
|
ParameterExpression param = Expression.Parameter(typeof(T), "t");
|
|||
|
|
Expression body = param;
|
|||
|
|
if (Nullable.GetUnderlyingType(body.Type) != null)
|
|||
|
|
body = Expression.Property(body, "Value");
|
|||
|
|
body = GetPropertyLambdaExpression(body, sort);
|
|||
|
|
LambdaExpression keySelectorLambda = Expression.Lambda(body, param);
|
|||
|
|
|
|||
|
|
if (string.IsNullOrEmpty(order))
|
|||
|
|
order = "ASC";
|
|||
|
|
string queryMethod = isThen ? order.ToUpper() == "DESC" ? "ThenByDescending" : "ThenBy" : order.ToUpper() == "DESC" ? "OrderByDescending" : "OrderBy";
|
|||
|
|
query = query.Provider.CreateQuery<T>(Expression.Call(typeof(Queryable), queryMethod,
|
|||
|
|
new Type[] { typeof(T), body.Type },
|
|||
|
|
query.Expression,
|
|||
|
|
Expression.Quote(keySelectorLambda)));
|
|||
|
|
return query;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static Expression GetPropertyLambdaExpression(Expression body, string fileName)
|
|||
|
|
{
|
|||
|
|
string[] propertyNames = fileName.Split('.');
|
|||
|
|
Type type = body.Type;
|
|||
|
|
foreach (string propertyName in propertyNames)
|
|||
|
|
{
|
|||
|
|
PropertyInfo property = type.GetProperty(propertyName);
|
|||
|
|
//Contract.Assume(property != null);
|
|||
|
|
if (property == null)
|
|||
|
|
{
|
|||
|
|
throw new Exception($"类型{type.Name}不存在属性{propertyName}");
|
|||
|
|
}
|
|||
|
|
type = property.PropertyType;
|
|||
|
|
body = Expression.MakeMemberAccess(body, property);
|
|||
|
|
}
|
|||
|
|
return body;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|