public PagedResult<Product> GetProductsByType(ProductType type, int page, int itemsPerPage)
        {
            PagedResult<Product> result = new PagedResult<Product>();
            result.PageNumber = page;
            result.ItemsPerPage = itemsPerPage;

            using (SqlConnection connection = new SqlConnection(this._connectionString))
            {
                string sql = @"Select * From VintageRabbit.Products Where [Type] = @Type Order By DateCreated Desc OFFSET @Offset ROWS FETCH NEXT @ResultsPerPage ROWS ONLY;
                               Select Count(*) From VintageRabbit.Products Where [Type] = @Type;";
                int offset = (page - 1) * itemsPerPage;

                using (var multi = connection.QueryMultiple(sql, new { Type = type.ToString(), Offset = offset, ResultsPerPage = itemsPerPage }))
                {
                    var productResults = multi.Read<ProductDb>();

                    foreach (var product in productResults)
                    {
                        result.Add(this.ConvertToProduct(product));
                    }

                    result.TotalResults = multi.Read<int>().First();
                }
            }

            return result;
        }
示例#2
0
        public override PagedResult <TEntity, TKey> Select(int pageNumber, int pageSize,
                                                           IDbConnection connection,
                                                           Sort <TEntity, TKey> sorting,
                                                           Expression <Func <TEntity, bool> > expression = null,
                                                           IDbTransaction transaction = null)
        {
            WhereClauseBuildResult whereClauseBuildResult = expression != null?this.BuildWhereClause(expression) : null;

            var sqlBuilder = new StringBuilder();

            sqlBuilder.Append($"SELECT (SELECT COUNT(*) FROM {this.mapping.GetEscapedTableName<TEntity, TKey>(this.dialectSettings)}");
            if (whereClauseBuildResult != null)
            {
                sqlBuilder.Append($" WHERE {whereClauseBuildResult.WhereClause} ");
            }
            sqlBuilder.AppendLine(") AS _TotalNumberOfRecords,");
            sqlBuilder.AppendLine($" * FROM (SELECT ROW_NUMBER() OVER (ORDER BY {this.BuildOrderByClause(sorting)}) AS _RowNumber, * FROM {this.mapping.GetEscapedTableName<TEntity, TKey>(this.dialectSettings)}");
            if (whereClauseBuildResult != null)
            {
                sqlBuilder.AppendLine($" WHERE {whereClauseBuildResult.WhereClause} ");
            }
            sqlBuilder.AppendLine($") AS PagedResult WHERE _RowNumber >= {(pageNumber - 1) * pageSize + 1} AND _RowNumber < {pageNumber * pageSize + 1} ORDER BY _RowNumber");
            var sql = sqlBuilder.ToString();

            var pagedResult = new PagedResult <TEntity, TKey>
            {
                PageNumber = pageNumber,
                PageSize   = pageSize
            };

            using (var command = connection.CreateCommand())
            {
                command.CommandText = sql;
                if (transaction != null)
                {
                    command.Transaction = transaction;
                }
                if (whereClauseBuildResult != null)
                {
                    command.Parameters.Clear();
                    foreach (var kvp in whereClauseBuildResult.ParameterValues)
                    {
                        var param = command.CreateParameter();
                        param.ParameterName = kvp.Key;
                        param.Value         = kvp.Value;
                        command.Parameters.Add(param);
                    }
                }
                using (var reader = command.ExecuteReader())
                {
                    var totalNumOfRecordsRead = false;
                    while (reader.Read())
                    {
                        if (!totalNumOfRecordsRead)
                        {
                            pagedResult.TotalRecords = Convert.ToInt32(reader["_TotalNumberOfRecords"]);
                            pagedResult.TotalPages   = (pagedResult.TotalRecords - 1) / pageSize + 1;
                            totalNumOfRecordsRead    = true;
                        }
                        var entity = new TEntity();
                        typeof(TEntity)
                        .GetTypeInfo()
                        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
                        .Where(p => p.CanWrite && p.PropertyType.IsSimpleType())
                        .ToList()
                        .ForEach(x =>
                        {
                            var value = reader[mapping.GetColumnName <TEntity, TKey>(x)];
                            x.SetValue(entity, EvaluatePropertyValue(x, value));
                        });
                        pagedResult.Add(entity);
                    }
                    reader.Close();
                }
            }

            return(pagedResult);
        }
        public PagedResult<Product> GetProductsByCategory(ProductType type, Category category, int page, int itemsPerPage)
        {
            PagedResult<Product> result = new PagedResult<Product>();
            result.PageNumber = page;
            result.ItemsPerPage = itemsPerPage;

            IList<int> categoryIds = new List<int>() { category.Id };
            foreach(var child in category.Children)
            {
                categoryIds.Add(child.Id);
            }

            string sql = @"Select * From VintageRabbit.Products
                            Where [Type] = @Type And VintageRabbit.Products.Id In (Select Distinct ProductId From VintageRabbit.ProductCategories Where CategoryId In @CategoryIds)
                            Order By DateCreated Desc
                            OFFSET @Offset ROWS FETCH NEXT @ResultsPerPage ROWS ONLY;
                               Select Count(*) From VintageRabbit.Products Where [Type] = @Type And VintageRabbit.Products.Id In (Select Distinct ProductId From VintageRabbit.ProductCategories Where CategoryId In @CategoryIds);";

            int offset = (page - 1) * itemsPerPage;

            using (SqlConnection connection = new SqlConnection(this._connectionString))
            {
                using (var multi = connection.QueryMultiple(sql, new { CategoryIds = categoryIds, Type = type.ToString(), Offset = offset, ResultsPerPage = itemsPerPage }))
                {
                    var productResults = multi.Read<ProductDb>();

                    foreach (var product in productResults)
                    {
                        result.Add(this.ConvertToProduct(product));
                    }

                    result.TotalResults = multi.Read<int>().First();
                }

            }

            return result;
        }