SQL ile Veritabanında Sayfalama İşlemi

Elimizdeki senaryoda bir eticaret sitesinde,ürün listeleme sayfasında ürünleri listelerken performans arttırmak için sayfalama işlemini veritabanında yapıyoruz.
Sayfa yüklendiğinde PageIndex ve PageSize parametrelerini belirtiyoruz ve veritabanından belirtilen adette ürünü listeliyoruz.
TotalCount ile toplamda ne kadar ürün olduğunu alıyoruz ve sayfalama işlemini yapmak için kullanıyoruz.
Kullanıcı sitede diğer sayfalara tıkladıkça 2.sayfaya geçiyoruz ve 10-20 arası kayıtı getiriyoruz.
Böylelikle binlerce ürünü sayfa yüklenirken çektikten sonra sayfalama yapmak yerine gönderdiğimiz parametrelere göre veri çekiyoruz.
Bu işlemleri yapmak için bir Procedure hazırlıyoruz ve geriye sadece parametreleri göndermek kalıyor.

CREATE PROCEDURE [dbo].[getProductsByCategory]
@CategoryID INT
,@PageIndex INT
,@PageSize INT
,@MinPrice DECIMAL(8,2) = NULL
,@MaxPrice DECIMAL(8,2) = NULL
AS
BEGIN
 
DECLARE @TotalCount INT
 
;WITH ProductList AS (
	SELECT 
		product_colours.id,
		product_models.product_name,
		product_colours.display_order,
		product_colours.market_price,
		product_colours.sell_price,
		product_images.image_name,
		site_brands.id AS BrandID,
		site_brands.brand_name
	FROM
		site_categories 
		INNER JOIN	relation_supplier_categories ON site_categories.id = relation_supplier_categories.site_category_id
		INNER JOIN	supplier_categories ON relation_supplier_categories.supplier_category_id = supplier_categories.id
		INNER JOIN	product_models ON supplier_categories.id = product_models.supplier_category_id 
		INNER JOIN	product_colours ON product_models.id = product_colours.model_id 
		INNER JOIN	product_images ON product_colours.id = product_images.colour_id
		INNER JOIN product_sizes ON product_colours.id = product_sizes.colour_id
		INNER JOIN relation_supplier_brands ON relation_supplier_brands.supplier_brand_id = product_models.supplier_brand_id
		INNER JOIN site_brands ON site_brands.id = relation_supplier_brands.site_brand_id
	WHERE  
		(site_categories.id = @CategoryID) AND
		(product_models.is_active = 1) AND
		(product_colours.is_active = 1) AND
		(product_sizes.is_active = 1) AND
		(product_images.is_main = 1) AND
		(product_models.is_approved = 1) AND
		(product_colours.is_approved = 1) AND
		(product_sizes.is_approved = 1) AND
		(product_images.is_approved = 1) AND
		(product_sizes.stock_amount > 0) 
		GROUP BY 
		product_colours.id,
		product_models.product_name,
		product_colours.display_order,
		product_colours.market_price,
		product_colours.sell_price,
		product_images.image_name,
		site_brands.id,
		site_brands.brand_name
)
 
 
SELECT * FROM (
		SELECT
			ROW_NUMBER() OVER (ORDER BY product_name DESC)AS RowNumber,
			 COUNT(id) OVER() TotalCount,
			 id,
			 product_name,
			 display_order,
			 market_price,
			 sell_price,
			 image_name,
			 BrandID,
			 brand_name
		FROM 
			ProductList  
		WHERE  
			(@MinPrice IS NULL OR sell_price >= @MinPrice) AND
			(@MaxPrice IS NULL OR sell_price <= @MaxPrice) 
 
) FilterProductList 
WHERE 
FilterProductList.RowNumber BETWEEN ( @PageIndex - 1 ) * @PageSize + 1 AND @PageIndex * @PageSize
END

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir