Exemple #1
0
        /// <summary>
        /// list 转换为 PagingDataSource
        /// </summary>
        /// <returns></returns>
        private static PagingDataSource <T> ToPagingDataSource <T>(this IList <T> dataSource,
                                                                   OrderPagingQuery <T> orderPagingQuery, int recordCount = 0) where T : class
        {
            var pagingData = new PagingDataSource <T>(dataSource, orderPagingQuery.Page, orderPagingQuery.PageSize,
                                                      recordCount);

            pagingData.OrderFieldStore = orderPagingQuery.OrderFieldStore;
            return(pagingData);
        }
        public static string BuildPageSql <T>(string withSql, OrderPagingQuery <T> query, string tableName = "TResult") where T : class
        {
            var sqlCommand = new StringBuilder();

            sqlCommand.Append(withSql);
            sqlCommand.Append("SELECT ");
            sqlCommand.Append("*");
            sqlCommand.Append(" FROM (SELECT ROW_NUMBER() OVER(");

            StringBuilder orderFileds = BuildOrderField(query.OrderFieldStore);

            sqlCommand.Append(orderFileds);

            sqlCommand.Append(") AS ROW_NUMBER,");
            sqlCommand.Append("*");
            sqlCommand.Append(" FROM ");
            sqlCommand.Append(tableName);
            sqlCommand.Append(") AS T0 WHERE ROW_NUMBER BETWEEN ");
            sqlCommand.Append((((query.Page - 1) * query.PageSize) + 1).ToString());
            sqlCommand.Append(" AND ");
            sqlCommand.Append((query.Page * query.PageSize).ToString());

            return(sqlCommand.ToString());
        }
Exemple #3
0
        /// <summary>
        /// 获取排序并分页的数据 如果有排序条件 会覆盖已有的排序条件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="queryableSource"></param>
        /// <param name="pagingQuery"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        public static PagingDataSource <T> QueryPagingDataSource <T>(this IQueryable <T> queryableSource, OrderPagingQuery <T> pagingQuery, int recordCount = 0) where T : class
        {
            if (recordCount == 0 && pagingQuery.IsGetRecordCount)
            {
                recordCount = queryableSource.Count();
            }

            bool ordered = false;

            foreach (OrderField <T> orderField in pagingQuery.OrderFieldStore.OrderFields)
            {
                string orderType = string.Empty;
                if (orderField.OrderType == OrderType.Descending)
                {
                    orderType = ordered ? "ThenByDescending" : "OrderByDescending";
                }
                else if (orderField.OrderType == OrderType.Ascending)
                {
                    orderType = ordered ? "ThenBy" : "OrderBy";
                }

                if (!string.IsNullOrEmpty(orderType))
                {
                    Expression sortExpression = Unbox(orderField.MemberExpression.Body);
                    Type       sortType       = sortExpression.Type;//排序字段的实际类型
                    Type       funType        = typeof(Func <,>);
                    funType = funType.MakeGenericType(typeof(T), sortType);

                    LambdaExpression lambda = Expression.Lambda(funType, sortExpression,
                                                                orderField.MemberExpression.Parameters);
                    MethodCallExpression method = Expression.Call(typeof(Queryable), orderType,
                                                                  new Type[] { typeof(T), sortExpression.Type },
                                                                  queryableSource.Expression, lambda);

                    queryableSource = queryableSource.Provider.CreateQuery <T>(method);
                    ordered         = true;
                }
            }

            return
                (ToPagingDataSource(queryableSource.Skip(pagingQuery.GetSkipCount()).Take(pagingQuery.PageSize).ToList(),
                                    pagingQuery, recordCount));
        }
Exemple #4
0
        /// <summary>
        /// 对list进行排序和分页
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="listSource"></param>
        /// <param name="pagingQuery"></param>
        /// <param name="recordCount"></param>
        /// <returns></returns>
        public static PagingDataSource <T> ListPagingDataSource <T>(this IList <T> listSource, OrderPagingQuery <T> pagingQuery, int recordCount = 0) where T : class
        {
            if (recordCount == 0 && pagingQuery.IsGetRecordCount)
            {
                recordCount = listSource.Count();
            }

            IOrderedEnumerable <T> query = null;

            foreach (OrderField <T> orderField in pagingQuery.OrderFieldStore.OrderFields)
            {
                if (orderField.OrderType != OrderType.None)
                {
                    if (query != null)
                    {
                        if (orderField.OrderType == OrderType.Ascending)
                        {
                            query = query.ThenBy(orderField.MemberExpression.Compile());
                        }
                        if (orderField.OrderType == OrderType.Descending)
                        {
                            query = query.ThenByDescending(orderField.MemberExpression.Compile());
                        }
                    }
                    else
                    {
                        if (orderField.OrderType == OrderType.Ascending)
                        {
                            query = listSource.OrderBy(orderField.MemberExpression.Compile());
                        }
                        if (orderField.OrderType == OrderType.Descending)
                        {
                            query = listSource.OrderByDescending(orderField.MemberExpression.Compile());
                        }
                    }
                }
            }

            return
                (ToPagingDataSource(query.Skip(pagingQuery.GetSkipCount()).Take(pagingQuery.PageSize).ToList(),
                                    pagingQuery, recordCount));
        }