LINQ Deferred Execution
Give a real production-style example of using LINQ Deferred Execution. Walk through the scenario end-to-end.
Answers use simple, clear English.
Audio N/AQuick interview answer
Scenario: users.Where(u => u.Active).Select(u => u.Email) builds pipeline; SQL generated only on ToListAsync in EF. Implementation notes: Materialize once with ToList when reusing; use AsNoTracking for read-only EF.
Detailed answer
Scenario: users.Where(u => u.Active).Select(u => u.Email) builds pipeline; SQL generated only on ToListAsync in EF. Implementation notes: Materialize once with ToList when reusing; use AsNoTracking for read-only EF. Core: LINQ queries on IEnumerable defer until enumeration (foreach, ToList). Multiple enumerations re-run pipeline. IQueryable pushes expression to provider (EF SQL). Real-time example: users.Where(u => u.Active).Select(u => u.Email) builds pipeline; SQL generated only on ToListAsync in EF. Pros: Composable query building; provider translation for databases. Cons: Multiple enumeration surprise; captured variables in closures may stale. Common mistakes: Calling Count() then foreach expecting cached results on deferred IEnumerable. Best practices: Materialize once with ToList when reusing; use AsNoTracking for read-only EF. Audience level: Mid-level.
Full explanation
LINQ queries on IEnumerable defer until enumeration (foreach, ToList). Multiple enumerations re-run pipeline. IQueryable pushes expression to provider (EF SQL).
Real example & use case
users.Where(u => u.Active).Select(u => u.Email) builds pipeline; SQL generated only on ToListAsync in EF.
Pros & cons
Pros: Composable query building; provider translation for databases. Cons: Multiple enumeration surprise; captured variables in closures may stale.
Common mistakes
Calling Count() then foreach expecting cached results on deferred IEnumerable.
Best practices
Materialize once with ToList when reusing; use AsNoTracking for read-only EF.
Follow-up questions
Open one as its own read / solve / listen card