Data Querying
Implementation
- Use the following for querying in this order
IPageRetriever for querying - More testable
- Applies request context automatically
ObjectQuery/DocumentQuery- Handles protecting against SQL injection
- Generates syntactically correct SQL
- Makes queries dynamically composable
- SQL text in C#
- Under source control
- Integration testable
- SQL queries in CMS
- Modifiable if needed
- Ideal for CMS UI (Custom Module Classes / UniGrid definitions)
- Store procedures
- Database is not good source control
- Create query extensions for common patterns
- Always use async querying
Optimizations
- Avoid N+1 querying
- Use
.Columns() to improve query performance - Retrieve the full
TreeNode if you need to call a method requiring a TreeNode (ex: IPageUrlRetriever)
Refactoring
- Use
nameof() to aid in refactor - Avoid authoring SQL in the admin application
- Write integration tests for complex queries
Results
- Include identifiers to set cache keys
- Get Image/Width height for Media Library/Attachments
- Map Xperience types (
TreeNode, BaseInfo objects) into DTOs - Optimizes caching
- Only retrieved data is accessible (
TreeNode is a dynamic container)
Use Result Container for Querying
Model Missing Data with Maybe/Option Container