Phase 26 of 30 · Topic 26.2

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.