IQueryable查询器扩展Expression动态排序
查询器扩展方法
public static async Task<List<T>> GetPageOrderList<T>(this IQueryable<T> queryable, Expression<Func<T, bool>> condition, PageBase pageBase)
{
var property = typeof(T).GetProperty(pageBase.SortField);
var parameter = Expression.Parameter(typeof(T), "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
var query = queryable.Where(condition);
string methodName = pageBase.IsAsc ?"OrderBy" : "OrderByDescending";
MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(T), property.PropertyType }, query.Expression, Expression.Quote(orderByExp));
query = query.Provider.CreateQuery<T>(resultExp);
pageBase.TotalCount = query.Count();
var result =await query.Skip((pageBase.PageIndex - 1) * pageBase.PageSize).Take(pageBase.PageSize).ToListAsync();
return result;
}
public static async Task<List<T>> GetOrderList<T>(this IQueryable<T> queryable, Expression<Func<T, bool>> condition, PageBase pageBase)
{
var property = typeof(T).GetProperty(pageBase.SortField, BindingFlags.IgnoreCase);
var parameter = Expression.Parameter(typeof(T), "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
var query = queryable.Where(condition);
string methodName = pageBase.IsAsc ? "OrderBy" : "OrderByDescending";
MethodCallExpression resultExp = Expression.Call(typeof(Queryable), methodName, new Type[] { typeof(T), property.PropertyType }, query.Expression, Expression.Quote(orderByExp));
query = query.Provider.CreateQuery<T>(resultExp);
pageBase.TotalCount = query.Count();
var result = await query.ToListAsync();
return result;
}
分页类
public class PageBase
{
[Required(ErrorMessage = "页码不可为空.")]
public int PageIndex { get; set; }
[Required(ErrorMessage = "每页大小不可为空.")]
public int PageSize { get; set; }
public string SortField { get; set; }
public bool IsAsc { get; set; }
public int TotalCount { get; set; }
public int TotalPage
{
get
{
if (TotalCount > 0)
{
return TotalCount % PageSize > 0 ? (TotalCount / PageSize + 1) : TotalCount / PageSize;
}
return 0;
}
}
}