🔍 API Query = Filtering & Sorting
APIs need flexible queries. Filtering, sorting, and pagination make APIs powerful.
📝 Query Parameters
# Filtering GET /api/users?status=active GET /api/users?age=30 GET /api/users?age=gte:30 GET /api/users?name=John # Sorting GET /api/users?sort=name GET /api/users?sort=-createdAt GET /api/users?sort=name,-createdAt # Pagination GET /api/users?page=2&limit=20 GET /api/users?offset=20&limit=20 GET /api/users?cursor=123&limit=20 # Combining Queries GET /api/users?status=active&sort=-createdAt&page=2 # Field Selection GET /api/users?fields=id,name,email GET /api/products?fields=id,name,price # Text Search GET /api/products?search=laptop GET /api/products?q=wireless+headphones
🎯 Implementation
// Query Builder public class QueryBuilderwhere T : class { private IQueryable _query; public QueryBuilder(IQueryable query) { _query = query; } public QueryBuilder Filter(QueryFilter filter) { foreach (var condition in filter.Conditions) { _query = _query.Where(CreateExpression(condition)); } return this; } public QueryBuilder Sort(QuerySort sort) { if (sort.IsDescending) { _query = _query.OrderByDescending(CreateOrderExpression(sort.Field)); } else { _query = _query.OrderBy(CreateOrderExpression(sort.Field)); } return this; } public QueryBuilder Page(int page, int limit) { _query = _query.Skip((page - 1) * limit).Take(limit); return this; } public QueryResult Build() { return new QueryResult { Data = _query.ToList(), Total = _query.Count() }; } } // Usage var result = new QueryBuilder (db.Users) .Filter(new { status = "active" }) .Sort(new { field = "name", descending = false }) .Page(2, 20) .Build();
💡 API Query Tips
- Use consistent naming
- Support common operators
- Validate query parameters
- Set sensible defaults
- Document query options
Flexible query parameters make APIs powerful and user-friendly. They give clients control over data retrieval.
