直接干货
public class DbHelper<T> where T : class
{
/// <summary>
/// 分页数据帮助类
/// </summary>
/// <returns></returns>
public static List<T> GetListPage(DbContext db, Expression<Func<T, bool>> whereLambda, string orderbyField, bool isAsc, int pageIndex, int pageSize, out int totalCount)
{
try
{
var property = typeof(T).GetProperty(orderbyField);//获取类型中需要排序的字段属性 Field
var parameter = Expression.Parameter(typeof(T), "p");//用表达式映射为 p
var propertyAccess = Expression.MakeMemberAccess(parameter, property);//用表达式将字段属性映射为形如 p.Field 格式
var orderByExp = Expression.Lambda(propertyAccess, parameter);//用表达式将 p.Field 映射为形如 p=>p.Field 格式
var query = db.Set<T>().Where(whereLambda);
string methodName = 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);
totalCount = query.Count();
var DataList = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
return DataList;
}
catch (Exception ex)
{
NLogHelper.Error($"{typeof(T).Name}类中不存在属性:{orderbyField},无法进行排序,已按默认值进行数据输出。");
var query = db.Set<T>().Where(whereLambda);
totalCount = query.Count();
var DataList = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
return DataList;
}
}
}