DEV Community

AlexfamDan
AlexfamDan

Posted on

how to find in order you want

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);
Enter fullscreen mode Exit fullscreen mode

}

Top comments (1)

Collapse
 
samod_alex profile image
Samod Alex

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?