/// <summary>
        /// Ctor
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="pageIndex">Page index</param>
        /// <param name="pageSize">Page size</param>
        public PagedList(IQueryable <T> source, GridPageModel pager)
        {
            if (!string.IsNullOrWhiteSpace(pager.sidx) && pager.sidx.Trim().Length > 0)
            {
                string sortingDir = string.Empty;
                if (pager.sord.ToUpper().Trim() == "ASC")
                {
                    sortingDir = "OrderBy";
                }
                else if (pager.sord.ToUpper().Trim() == "DESC")
                {
                    sortingDir = "OrderByDescending";
                }
                //ParameterExpression param = Expression.Parameter(typeof(T), sortExpression);
                //PropertyInfo pi = typeof(T).GetProperty(sortExpression);
                //Type[] types = new Type[2];
                //types[0] = typeof(T);
                //types[1] = pi.PropertyType;
                //Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, source.Expression, Expression.Lambda(Expression.Property(param, sortExpression), param));
                //source = source.AsQueryable().Provider.CreateQuery<T>(expr);


                source = source.OrderBy(pager.sidx + " " + pager.sord);
            }

            int total = source.Count();

            this.TotalCount = total;
            this.TotalPages = total / pager.rows;

            if (total % pager.rows > 0)
            {
                TotalPages++;
            }

            this.PageSize  = pager.rows;
            this.PageIndex = pager.page;
            this.AddRange(source.Skip((pager.page - 1) * pager.rows).Take(pager.rows).ToList());
        }
        /// <summary>
        /// Ctor
        /// </summary>
        /// <param name="source">source</param>
        /// <param name="pageIndex">Page index</param>
        /// <param name="pageSize">Page size</param>
        public PagedList(List <T> source, GridPageModel pager)
        {
            var query = source.AsQueryable();

            if (pager.sidx.Trim().Length > 0)
            {
                string sortingDir = string.Empty;
                if (pager.sord.ToUpper().Trim() == "ASC")
                {
                    sortingDir = "OrderBy";
                }
                else if (pager.sord.ToUpper().Trim() == "DESC")
                {
                    sortingDir = "OrderByDescending";
                }
                ParameterExpression param = Expression.Parameter(typeof(T), pager.sidx);
                PropertyInfo        pi    = typeof(T).GetProperty(pager.sidx);
                Type[] types = new Type[2];
                types[0] = typeof(T);
                types[1] = pi.PropertyType;
                Expression expr = Expression.Call(typeof(Queryable), sortingDir, types, query.Expression, Expression.Lambda(Expression.Property(param, pager.sidx), param));
                query = query.AsQueryable().Provider.CreateQuery <T>(expr);
            }

            TotalCount = query.Count();
            TotalPages = TotalCount / pager.rows;

            if (TotalCount % pager.rows > 0)
            {
                TotalPages++;
            }

            this.PageSize  = pager.rows;
            this.PageIndex = pager.page;
            this.AddRange(query.Skip((pager.page - 1) * pager.rows).Take(pager.rows).ToList());
        }