using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Reflection; using System.Linq.Expressions; namespace Mtxfw.Utility { public static class PagingHelper { /// /// 获取分页SQL语句,默认row_number为关健字,所有表不允许使用该字段名 /// /// 记录总数 /// 每页记录数 /// 当前页数 /// SQL查询语句 /// 排序字段,多个则用“,”隔开 /// 分页SQL语句 public static string CreatePagingSql(int _recordCount, int _pageSize, int _pageIndex, string _safeSql, string _orderField) { //计算总页数 _pageSize = _pageSize == 0 ? _recordCount : _pageSize; int pageCount = (_recordCount + _pageSize - 1) / _pageSize; //检查当前页数 if (_pageIndex < 1) { _pageIndex = 1; } else if (_pageIndex > pageCount) { _pageIndex = pageCount; } //拼接SQL字符串,加上ROW_NUMBER函数进行分页 StringBuilder newSafeSql = new StringBuilder(); newSafeSql.AppendFormat("SELECT ROW_NUMBER() OVER(ORDER BY {0}) as row_number,", _orderField); newSafeSql.Append(_safeSql.Substring(_safeSql.ToUpper().IndexOf("SELECT") + 6)); //拼接成最终的SQL语句 StringBuilder sbSql = new StringBuilder(); sbSql.Append("SELECT * FROM ("); sbSql.Append(newSafeSql.ToString()); sbSql.Append(") AS T"); sbSql.AppendFormat(" WHERE row_number between {0} and {1}", ((_pageIndex - 1) * _pageSize) + 1, _pageIndex * _pageSize); return sbSql.ToString(); } /// /// 获取记录总数SQL语句 /// /// SQL查询语句 /// 记录总数SQL语句 public static string CreateCountingSql(string _safeSql) { return string.Format(" SELECT COUNT(1) AS RecordCount FROM ({0}) AS T ", _safeSql); } } public static class PageHelper { /// /// 按页码分页 /// /// 要分页的数据集合 /// 页码 /// 页大小 /// public static object PageByIndex(this IEnumerable objects, int pageIndex, int pageSize) { return objects.Skip(pageIndex * pageSize).Take(pageSize); } /// /// 获取当前项在列表中的位置 /// /// /// /// /// /// public static int GetPageIndex(object[] list, object item, string property = "ID") { PropertyInfo ptyIdInfo = typeof(T).GetProperty(property); var index = 0; for (int i = 0; i < list.Length; i++) { var objid = ptyIdInfo.GetValue(list[i], null); if (Equals(objid, item)) { index = i; break; } } return index; } /// /// 按lastid分页 /// /// /// 要分页的数据集合 /// 分页项值 /// 分页项 /// 分页项是最后一个还是任意中间一个 /// 页大小 /// public static object PageByLastId(this IEnumerable objects, object item, bool iswilful = false, int pageSize = 0, string property = "ID") { if (pageSize == 0) pageSize = 10; if (item == null || item.ToString() == "") { return objects.PageByIndex(0, pageSize); } var list = objects as object[] ?? objects.ToArray(); var index = GetPageIndex(list, item, property); if (iswilful) { return list.Skip(index + 1).Take(pageSize); //取任意ID后面pageSize条 } else { if ((index + 1) % pageSize == 0) { var pageIndex = index / pageSize + 1; return PageByIndex(list, pageIndex, pageSize); } else { return new List(); } } } } public class QueryParameters { public string order { get; set; } public int page { get; set; } public int rows { get; set; } public string sort { get; set; } } public class DataGrid { /// /// 默认构造函数 /// public DataGrid() { } /// /// 构造函数 /// /// 表格数据 public DataGrid(List rows) { this.rows = rows; } private List _rows = new List(); /// /// 表格数据 /// public List rows { get { return _rows; } set { if (value != null) { _rows = value; } } } /// /// 总记录数 /// public int total { get; set; } public static DataGrid QueryWithParameters(IEnumerable queryable, QueryParameters queryParameters) { if (queryable == null) { return new DataGrid(); } queryParameters = queryParameters ?? new QueryParameters(); IQueryable source = Queryable.AsQueryable(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 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)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)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(s, rows) : Queryable.Take(Queryable.Skip(s, count), rows); return new DataGrid() { total = num, rows = s.ToList() }; } } }