Query Patterns
Introduction
Parameterized Query Patterns
Pattern: Single Entity Lookup
using Paramore.Darker;
// Query by primary key
public sealed class GetPersonNameQuery : IQuery<string>
{
public GetPersonNameQuery(int personId)
{
PersonId = personId;
}
public int PersonId { get; }
}
// Query by unique alternate key
public sealed class GetCustomerByEmailQuery : IQuery<CustomerDto?>
{
public GetCustomerByEmailQuery(string email)
{
if (string.IsNullOrWhiteSpace(email))
throw new ArgumentException("Email is required", nameof(email));
Email = email;
}
public string Email { get; }
}
// Query by composite key
public sealed class GetOrderLineQuery : IQuery<OrderLineDto?>
{
public GetOrderLineQuery(int orderId, int lineNumber)
{
OrderId = orderId;
LineNumber = lineNumber;
}
public int OrderId { get; }
public int LineNumber { get; }
}Pattern: Filtered List
Pattern: Search with Multiple Criteria
Pagination Patterns
Pattern: Offset-Based Pagination
Pattern: Cursor-Based Pagination
Projection Patterns
Pattern: Simple Projection
Pattern: Complex Projection with Joins
Pattern: Calculated Fields
Collection and Aggregation Patterns
Pattern: Small Collection (Get All)
Pattern: Count Query
Pattern: Summary/Statistics
Entity Framework Core Integration
Pattern: AsNoTracking for Read-Only Queries
Pattern: Include Related Data (Eager Loading)
Pattern: Scoped Lifetime for EF Core
Pattern: Compiled Queries
Performance Best Practices
Pattern: Select Only What You Need
Pattern: Avoid N+1 Queries
Pattern: Use Async All the Way
Real-World Example: Product Catalog Query
Best Practices Summary
Common Pitfalls
Further Reading
Last updated
Was this helpful?
