Start here. This is the direct spoken answer to practice first.
Overview
Aligns selected database data with an API read model and avoids unnecessary ORM state.
I project when an endpoint needs a stable read shape rather than behavior from tracked entities. Selecting only required columns or a purpose-built expression reduces materialization, avoids accidental lazy relationships, and makes the API mapping explicit. I load entities when I need identity, relationship changes, or unit-of-work behavior. Projection is not automatically faster, but it removes work the request does not need.