Example 8: Summary — Group + Aggregate + Having
A Summary runs where → group → having → order → page in one shot through Summary<T>, ToList<T>(Summary) or ToListAsync<T>(Summary).
Request
{
"conditionGroup": {
"connector": "And",
"conditions": [
{
"sort": 1,
"field": "IsActive",
"dataType": "Boolean",
"operator": "Equal",
"values": ["true"]
}
],
"subConditionGroups": []
},
"groupBy": {
"fields": ["Category.Name"],
"aggregateBy": [
{ "field": null, "alias": "ProductCount", "aggregator": "Count" },
{ "field": "Price", "alias": "AvgPrice", "aggregator": "Average" },
{ "field": "Price", "alias": "TotalRevenue", "aggregator": "Sumation" }
]
},
"having": {
"connector": "And",
"conditions": [
{
"sort": 1,
"field": "ProductCount",
"dataType": "Number",
"operator": "GreaterThan",
"values": ["5"]
}
],
"subConditionGroups": []
},
"orders": [
{ "sort": 1, "field": "TotalRevenue", "direction": "Descending" }
],
"page": {
"pageNumber": 1,
"pageSize": 10
}
}Response shape (SummaryResult)
{
"pageNumber": 1,
"pageSize": 10,
"pageCount": 1,
"totalCount": 3,
"data": [
{ "CategoryName": "Electronics", "ProductCount": 15, "AvgPrice": 349.99, "TotalRevenue": 5249.85 },
{ "CategoryName": "Clothing", "ProductCount": 12, "AvgPrice": 45.00, "TotalRevenue": 540.00 }
],
"queryString": null
}Note
Note: Dotted GroupBy fields like
Category.Name become flattened aliases in the result (e.g. CategoryName).