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 (1)
I love how you expose pagination and an optional search term directly in the GetAllProductsAsync signature—it makes the ordering logic clean and testable. Have you considered cross‑posting this to ZyVOP (zyvop.com) to reach even more engineers?