Lambda动态排序分页通用方法
2016-10-18 10:02
435 查看
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace Common { public class QueryParameters { public QueryParameters(); public string order { get; set; } public int page { get; set; } public int rows { get; set; } public string sort { get; set; } } public class DataGrid<T> { /// <summary> /// 默认构造函数 /// </summary> public DataGrid() { } /// <summary> /// 构造函数 /// </summary> /// <param name="rows">表格数据</param> public DataGrid(List<T> rows) { this.rows = rows; } private List<T> _rows = new List<T>(); /// <summary> /// 表格数据 /// </summary> public List<T> rows { get { return _rows; } set { if (value != null) { _rows = value; } } } /// <summary> /// 总记录数 /// </summary> public int total { get; set; } public static DataGrid<T> QueryWithParameters(IEnumerable<T> queryable, QueryParameters queryParameters) { if (queryable == null) { return new DataGrid<T>(); } queryParameters = queryParameters ?? new QueryParameters(); IQueryable<T> source = Queryable.AsQueryable<T>(queryable); var page = queryParameters.page; var rows = queryParameters.rows; var sort = queryParameters.sort; var order = queryParameters.order; int num = source.Count(); int count = (page - 1) * rows; IQueryable<T> s = source; if (!string.IsNullOrWhiteSpace(sort)) { var sortExpression = Expression.Parameter(source.ElementType); var selector = Expression.Lambda(Expression.PropertyOrField(sortExpression, sort), sortExpression); if (order.ToLower() == "asc") { s = (IQueryable<T>)source.Provider.CreateQuery(Expression.Call(typeof(Queryable), "OrderBy", new Type[] { source.ElementType, selector.Body.Type }, source.Expression, selector)); } else if (order.ToLower() == "desc") { s = (IQueryable<T>)source.Provider.CreateQuery(Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { source.ElementType, selector.Body.Type }, source.Expression, selector)); } } //方法1 s = count == 0 ? s.Take(rows) : s.Skip(count).Take(rows); //方法2 s = count == 0 ? Queryable.Take<T>(s, rows) : Queryable.Take<T>(Queryable.Skip<T>(s, count), rows); return new DataGrid<T>() { total = num, rows = s.ToList() }; } } }
调用:
DataGrid<T>.QueryWithParameters(query, paging)
相关文章推荐
- Lambda动态排序通用方法
- sql分页带参数,带排序等,动态实现的方法
- DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
- 寫了個通用的比較器(comparer),應用动态生成Lambda(调用属性及方法)
- XSLT对XML数据进行分页且可以按某个值重新排序的方法
- 点击表头排序的几种方法 & 动态表格
- DataGrid常用三种方法:分页,排序,后绑定
- DataGrid常用三种方法:分页,排序,后绑定 (转)
- 通用动态生成静态HTML页方法
- 逐步为对象集合构建一个通用的按指定属性排序的方法
- 快速排序List的通用方法
- 动态查询条件,分页存储,正反向排序(亲身体验)
- 快速排序List的通用方法
- Asp.net实现通用以及高效的分页方法
- N位数排序问题的通用解决方法
- 通用高效分页存储过程代码--针对单一字段排序分页
- VB打造通用排序方法
- 通用的分页方法
- SqlServer通用分页的调用方法