public async Task> GetAllProductsAsync(
int pageNumber,
int pageSize,
string? search,
string? sortOrder,
string? sortBy,
CancellationToken cancellationToken)
{
IQueryable query =
_context.Products
.AsNoTracking();
// ============================
// Search
// ============================
if (!string.IsNullOrWhiteSpace(search))
{
search = search.Trim();
query = query.Where(x =>
x.Name.Contains(search) ||
x.Category.Contains(search));
}
// ============================
// Sorting
// ============================
query = sortBy?.ToLower() switch
{
"name" => sortOrder?.ToLower() == "desc"
? query.OrderByDescending(x => x.Name)
: query.OrderBy(x => x.Name),
"category" => sortOrder?.ToLower() == "desc"
? query.OrderByDescending(x => x.Category)
: query.OrderBy(x => x.Category),
"price" => sortOrder?.ToLower() == "desc"
? query.OrderByDescending(x => x.Price)
: query.OrderBy(x => x.Price),
"stock" => sortOrder?.ToLower() == "desc"
? query.OrderByDescending(x => x.Stock)
: query.OrderBy(x => x.Stock),
"createddate" => sortOrder?.ToLower() == "desc"
? query.OrderByDescending(x => x.CreatedDate)
: query.OrderBy(x => x.CreatedDate),
_ => query.OrderByDescending(x => x.CreatedDate)
};
// ============================
// Pagination
// ============================
pageNumber = pageNumber < 1 ? 1 : pageNumber;
pageSize = pageSize < 1
? 10
: Math.Min(pageSize, 100);
query = query
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize);
// ============================
// Database Query Execution
// ============================
return await query.ToListAsync(cancellationToken);
}
Top comments (0)