Query Parameters

All GET endpoints (list, by-id, count, pagedresult, custom routes) support a consistent set of query parameters for filtering, sorting, pagination, and eager loading of navigation properties.

Filtering

Syntax: filter[propertyName]=value — default operator is eq.

HTTP
GET /api/products?filter[isActive]=true
GET /api/products?filter[name]=Laptop
GET /api/products?filter[categoryId]=1

Filter Operators

Syntax: filter[propertyName][operator]=value. Operator names are case-insensitive.

OperatorSupported typesDescriptionExample
eqstring, value types, GuidEqual tofilter[name][eq]=Laptop
neqstring, value types, GuidNot equal tofilter[status][neq]=pending
likestring onlyContains substring (case-insensitive)filter[name][like]=key
nlikestring onlyDoes not contain substringfilter[name][nlike]=old
ltvalue types (not Guid)Less thanfilter[price][lt]=100
lteqvalue types (not Guid)Less than or equal tofilter[price][lteq]=100
gtvalue types (not Guid)Greater thanfilter[stock][gt]=0
gteqvalue types (not Guid)Greater than or equal tofilter[price][gteq]=50
instring, value types, GuidValue is in a JSON arrayfilter[categoryId][in]=[1,2,3]
ninstring, value types, GuidValue is not in a JSON arrayfilter[status][nin]=["pending","discontinued"]
HTTP — operator examples
GET /api/products?filter[price][gteq]=50&filter[price][lteq]=100
GET /api/products?filter[name][like]=book
GET /api/products?filter[categoryId][in]=[1,2,5]
GET /api/products?filter[status][nin]=["pending","discontinued"]
💡
For in / nin on enum properties, both integer values ([0,1]) and case-insensitive string names (["Pending","Active"]) are accepted.

Sorting

Syntax: sort[propertyName]=asc|desc. Multiple sort fields are supported.

Descending values: desc, 1, descending. Everything else is treated as ascending.

HTTP
GET /api/products?sort[price]=asc
GET /api/products?sort[name]=desc
GET /api/products?sort[price]=asc&sort[name]=desc
💡
If no sort is specified, results are ordered by the [Key] property descending.

Pagination

ParameterDefaultDescription
page 1 Page number starting from 1. Non-numeric or zero values silently default to 1.
pagesize Number of items per page. Non-numeric values are ignored. Clamped to MaxPageSize (default 1000).
HTTP
GET /api/products?page=1&pagesize=20
GET /api/products?filter[isActive]=true&sort[name]=asc&page=2&pagesize=10
💡
Using page / pagesize on a regular GET request returns a flat array with Skip / Take applied. For a JSON envelope with metadata, use /pagedresult.

PagedResult

Available only when .ExposePagedResult() is configured for the entity. Returns a rich pagination envelope with metadata.

HTTP
GET /api/products/pagedresult?page=2&pagesize=10
Response 200 OK
{
  "items": [ ... ],
  "page": 2,
  "pageSize": 10,
  "pageCount": 5,
  "total": 47
}
FieldDescription
itemsArray of objects for the current page
pageCurrent page number
pageSizeItems per page
pageCountTotal number of pages
totalTotal number of records matching the query

Include (Navigation Properties)

Eagerly loads related entities. Equivalent to EF Core's Include().

Syntax: include=NavPropertyName1,NavPropertyName2

HTTP
GET /api/products?include=Category
GET /api/products?filter[isActive]=true&include=Category
💡
Only navigation properties declared directly on the entity are supported. Nested includes (deeper than one level) and unknown property names are silently ignored.

Count

Returns a plain integer count respecting all applied filters.

HTTP
GET /api/products/count
GET /api/products/count?filter[isActive]=true
GET /api/products/count?filter[price][gt]=100&filter[stock][gt]=0
Response 200 OK
42

Compound Filters (AND / OR)

Flat syntax

All filter[...] parameters are collected into a single group. The operator parameter controls how they are joined.

HTTP
# Default AND — products containing "book" AND costing less than 50
GET /api/products?filter[name][like]=book&filter[price][lt]=50

# OR — products containing "laptop" OR "keyboard"
GET /api/products?filter[name][like]=laptop&filter[name][like]=keyboard&operator=or
operator valueLogic
(not specified)AND
orOR
⚠️
The flat operator parameter is global for the entire request. It is not possible to mix AND and OR for different fields using flat syntax. Use grouped syntax for mixed logic.

Grouped syntax

Filters are organised into numbered groups (filter[N][Property]). Each group has its own operator[N]. Filters within a group are combined by that group's operator; groups are always combined with AND.

Syntax
filter[N][PropertyName]=value
filter[N][PropertyName][operator]=value
operator[N]=or   # optional — use OR within group N; default is AND
HTTP — (Name LIKE "laptop" OR Name LIKE "keyboard") AND CategoryId = 1
GET /api/products?filter[0][name][like]=laptop&filter[0][name][like]=keyboard&operator[0]=or&filter[1][categoryId]=1
HTTP — (Price >= 100 OR Stock > 50) AND IsActive = true
GET /api/products?filter[0][price][gteq]=100&filter[0][stock][gt]=50&operator[0]=or&filter[1][isActive]=true
RuleDescription
Group index NA non-negative integer (0, 1, 2, …). Distinguishes groups from property names.
Within a groupCombined with operator[N] (AND by default, OR if operator[N]=or).
Between groupsAlways combined with AND.
Flat + groupedFlat filters form an implicit "default" group, controlled by the bare operator key.

Endpoint Reference

Quick summary of all standard endpoints generated for a registered entity:

MethodRouteStatus codes
GET/{route}200
GET/{route}/{id}200, 404
POST/{route}201, 400
PUT/{route}/{id}200, 400, 404
PATCH/{route}/{id}200, 400, 404
DELETE/{route}/{id}204, 400, 404
GET/{route}/count200
GET/{route}/pagedresult200 (when enabled)
💡
Enum fields in responses are always returned as integers. In request bodies (POST, PUT, PATCH) they accept both integers (0) and case-insensitive strings ("Pending").