示例#1
0
        /// <summary>
        /// QueryPageListAsync
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <returns></returns>
        public Task <PageResult <TEntity> > QueryPageListAsync <TEntity>(int pageIndex, int pageSize, string sql, object param = null, IDbContextTransaction trans = null) where TEntity : class
        {
            var connection = GetConnection();

            pageSize  = pageSize > 0 ? pageSize : 1;
            pageIndex = pageIndex > 0 ? pageIndex : 1;

            if (!PagingHelper.SplitSql(sql, out SqlParts parts))
            {
                throw new Exception("Unable to parse SQL statement for paged query");
            }
            long skip         = (pageIndex - 1) * pageSize;
            long take         = pageSize;
            var  databaseType = DatabaseType.MySql;

            if (_context.Database.IsMySql())
            {
                databaseType = DatabaseType.MySql;
            }
            else if (_context.Database.IsSqlServer())
            {
                databaseType = DatabaseType.SqlServer2012;
            }


            var sqlPage  = PagingHelper.GetSqlPage(skip, take, parts, databaseType);
            var sqlCount = parts.SqlCount;
            var result   = new PageResult <TEntity>
            {
                PageIndex = pageIndex,
                PageSize  = pageSize,
                Total     = connection.ExecuteScalar <long>(sqlCount)
            };

            if (result.Total == 0)
            {
                return(Task.FromResult(result));
            }
            result.PageCount = result.Total / pageSize;

            if ((result.Total % pageSize) != 0)
            {
                result.PageCount++;
            }

            result.Items = connection.Query <TEntity>(sqlPage, param, trans?.GetDbTransaction())?.ToList();
            return(Task.FromResult(result));
        }