Cartesian Explosion & Split Queries (`AsSplitQuery`)
1Concept
Joining multiple `.Include()` child collections in a single SQL query produces a cartesian product, duplicating parent rows thousands of times. `.AsSplitQuery()` splits the query into separate parallel SQL queries per table.
2Architecture Diagram
Single Query with 3 Includes: SELECT * FROM Orders JOIN Items JOIN Shipments ──> Returns 50,000 duplicated rows! (Cartesian Explosion!) Split Query (AsSplitQuery): 1. SELECT * FROM Orders WHERE ... 2. SELECT * FROM Items WHERE OrderId IN (...) 3. SELECT * FROM Shipments WHERE OrderId IN (...) (Clean & Fast!)
3Code Example
C# 13 & .NET 9
using System;
public class SplitQueryConceptDemo
{
public static void Main()
{
Console.WriteLine("Split query configuration:");
Console.WriteLine("var orders = await context.Orders");
Console.WriteLine(" .Include(o => o.Items)");
Console.WriteLine(" .Include(o => o.Shipments)");
Console.WriteLine(" .AsSplitQuery()");
Console.WriteLine(" .ToListAsync();");
}
}4Expected Output
Split query configuration:
var orders = await context.Orders
.Include(o => o.Items)
.Include(o => o.Shipments)
.AsSplitQuery()
.ToListAsync();5Key Takeaways
- ✓Use `.AsSplitQuery()` when including 2 or more related 1-to-many collections.
- ✓Can be configured globally in `DbContextOptionsBuilder`.
- ✓Prevents massive bandwidth and memory consumption caused by duplicated SQL columns.