
In this tutorial, we will understand what cartesian explosion is and how to solve that problem. Let’s look at this query:
var people = await ctx.People
.Include(p => p.Emails)
.Include(p => p.Addresses)
.ToListAsync();
It translates to:
SELECT "p"."Id", "p"."FirstName", "p"."LastName", "e"."Id", "e"."PersonEmail", "e"."PersonId", "a"."Id", "a"."PersonAddress", "a"."PersonId"
FROM "People" AS "p"
LEFT JOIN "Emails" AS "e" ON "p"."Id" = "e"."PersonId"
LEFT JOIN "Addresses" AS "a" ON "p"."Id" = "a"."PersonId"
ORDER BY "p"."Id", "e"."Id"
Personjoins withEmailandAddress. Both joins are at the same level.- A person can have multiple emails and adressess.
Let’s say a person with id = 1 have 10 emails and 10 addresses. The query returns 1x10x10 = 100 rows for 1 person. It is just for one person, how much they can be for 100 people. This problem is known as cartesian explosion