Data Querying
 Implementation
- Use the following for querying in this order - IPageRetrieverfor 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 TreeNodeif you need to call a method requiring aTreeNode(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,BaseInfoobjects) into DTOs- Optimizes caching
- Only retrieved data is accessible (TreeNodeis a dynamic container)
 
  Use Result Container for Querying
  Model Missing Data with Maybe/Option Container