利用反射获取匹配到字段进行排序,附带一下分页
1.排序
public static IQueryable<T> DataSort<T>(IQueryable<T> source, string fieldName, string sortDirection)
{
// 升序 or 降序
string sortingDir = "OrderBy";
if ( string.Equals(sortDirection.Trim(),"asc",StringComparison.OrdinalIgnoreCase))
{
sortingDir = "OrderBy";
}
if (string.Equals(sortDirection.Trim(), "desc", StringComparison.OrdinalIgnoreCase))
{
sortingDir = "OrderByDescending";
}
// 属性
var orderField = string.Empty;
Type t = typeof(T);
var attributes = t.Attributes;
var fields = t.GetFields();
var properties = t.GetProperties();
Type[] types = new Type[2]; // 参数:对象类型,属性类型
types[0] = typeof(T);
var isMatch = false;
foreach (var p in properties)
{
isMatch = string.Equals(fieldName, p.Name, StringComparison.OrdinalIgnoreCase);
if (isMatch)
{
orderField = p.Name;
types[1] = p.PropertyType;
}
}
if (!isMatch)
{
types[1] = properties.First().PropertyType;
orderField = properties.First().Name;
}
PropertyInfo pi = typeof(T).GetProperty(orderField);
ParameterExpression param = Expression.Parameter(typeof(T), orderField);
Expression expr = Expression.Call(typeof(Queryable), sortingDir, types,
source.Expression, Expression.Lambda(Expression.Property(param, orderField), param));
IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);
return query;
}
获取属性集合
Type t = typeof(T);
var attributes = t.Attributes;
var properties = t.GetProperties();
获取属性的类型和名称
types[1] = properties.First().PropertyType;
orderField = properties.First().Name;
关键点:调用了 Expression.Call 这个方法,用来创建新的表达式
参数说明:
Call(Type type,
string methodName,
Type[] typeArguments,
params Expression[] arguments);
-
Type type:
Queryable对象类型(typeof(Queryable))Queryable对象类型(typeof(Queryable)) -
string methodName:
要执行的方法名(此处为:OrderBy or OrderByDescending) -
Type[] typeArguments :
类型参数,这里有2个,第一个为集合中的对象的类型,第二个为属性类型 -
params Expression[] arguments :
多个Expression类型参数,这里有三个,- source.Expression,数据源(IQueryable)
- Expression.Lambda(Expression.Property(param, orderField)
Lambda参数表达式 - param:
参数表达式
需要的结果:创建新的表达式
IQueryable<T> query = source.AsQueryable().Provider.CreateQuery<T>(expr);
2.分页
public static IQueryable<T> DataPaging<T>(IQueryable<T> source, int pageNumber, int pageSize)
{
return source.Skip(( Math.Abs(pageNumber)-1) * pageSize).Take(pageSize);
}
3.排序加分页
public static IQueryable<T> Sorting<T>(IQueryable<T> source, string fieldName, string sortDirection, int pageIndex, int pageSize)
{
IQueryable<T> query = DataSort<T>(source, fieldName, sortDirection);
return DataPaging(query, pageIndex, pageSize);
}