Core Interfaces
IRequestQuery
Base interface for queries that don’t return a value.Core.Application.ComandQueryBus/Queries/IRequestQuery.cs:5
IRequestQuery<TResponse>
Base interface for queries that return a value.Core.Application.ComandQueryBus/Queries/IRequestQuery.cs:9
Type Parameters:
TResponse- The type of data returned by the query
IRequestQueryHandler<TRequest, TResponse>
Interface for query handlers that process queries and return results.Core.Application.ComandQueryBus/Queries/IRequestQueryHandler.cs:10
Type Parameters:
TRequest- The query typeTResponse- The response type
Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken)- Processes the query
Pagination Support
QueryRequest<TResponse>
Base class for paginated queries.Core.Application.ComandQueryBus/Queries/QueryRequest.cs:3
Properties:
PageIndex- Zero-based page indexPageSize- Number of items per page
QueryResult<TEntity>
Wraps query results with pagination metadata.Core.Application.ComandQueryBus/Queries/QueryResult.cs:3
Properties:
Items- The collection of entities for the current pageCount- Total number of items across all pagesPageIndex- Current page indexPageSize- Number of items per page
Query Examples
GetAllDummyEntitiesQuery
Query to retrieve all entities with pagination.Application/UseCases/DummyEntity/Queries/GetAllDummyEntities/GetAllDummyEntitiesQuery.cs:6
Returns: QueryResult<DummyEntityDto> with pagination metadata
Inherited Properties:
PageIndex- Page to retrievePageSize- Items per page
GetDummyEntityByQuery
Query to retrieve a single entity by ID.Application/UseCases/DummyEntity/Queries/GetDummyEntityBy/GetDummyEntityByQuery.cs:7
Returns: DummyEntityDto or null if not found
Handler Implementation Patterns
Collection Query Handler
Handler for retrieving multiple entities with pagination.Application/UseCases/DummyEntity/Queries/GetAllDummyEntities/GetAllDummyEntitiesHandler.cs:7
Handler Workflow
- Dependency Injection - Inject repository (typically read-only)
- Data Retrieval - Query repository using async methods
- Mapping - Transform domain entities to DTOs
- Pagination - Wrap results in
QueryResult<T>if applicable - Return - Return DTOs or null (never domain entities)
Single Entity Query Pattern
While not fully shown in the codebase, a typical single-entity handler would look like:Pagination Patterns
Using QueryRequest
Inherit fromQueryRequest<T> for automatic pagination support:
Building QueryResult
Always provide complete pagination metadata:Client-Side Pagination
Clients can request specific pages:Best Practices
Query Naming
Query Naming
- Use
Getprefix:GetAllEntities,GetEntityById - Be specific about what’s returned:
GetActiveUsers,GetRecentOrders - Append
Querysuffix for clarity - Avoid generic names like
GetDataorFetch
Read-Only Operations
Read-Only Operations
- Queries should NEVER modify state
- Use read-only repositories when available
- Consider using
IReadRepository<T>for explicit read-only access - Never call
Add,Update, orRemovein query handlers
DTO Mapping
DTO Mapping
- Always return DTOs, never domain entities
- Use the
To<TDto>()extension method for mapping - DTOs should be optimized for the query use case
- Include only necessary data to minimize payload
Performance
Performance
- Use async methods (
FindAllAsync,FindOneAsync) - Implement pagination for large datasets
- Consider caching for frequently accessed queries
- Project to DTOs at the database level when possible
Pagination
Pagination
- Always use
QueryRequest<T>for collection queries - Return
QueryResult<T>with accurate counts - Validate
PageSizeto prevent excessive data retrieval - Consider default page size if not specified
Query vs Command
| Aspect | Query | Command |
|---|---|---|
| Purpose | Read data | Modify data |
| Return Value | DTOs with data | ID or void |
| Side Effects | None | Persists changes |
| Repository Methods | FindAll, FindOne | Add, Update, Remove |
| Events | Never publishes | Publishes domain events |
| Validation | Parameter validation only | Full business rule validation |
Related Concepts
- Commands - Write operations in CQRS
- Repositories - Data access interfaces
- DTOs - Data transfer objects