LINQ Deferred Execution
You are a Junior on-call. A production issue might involve LINQ Deferred Execution. How do you diagnose and mitigate?
Answers use simple, clear English.
Quick interview answer
Mitigate first, then root-cause. Check symptoms against: Calling Count() then foreach expecting cached results on deferred IEnumerable..
Detailed answer
Mitigate first, then root-cause. Check symptoms against: Calling Count() then foreach expecting cached results on deferred IEnumerable.. Validate with: Materialize once with ToList when reusing; use AsNoTracking for read-only EF.. Context: LINQ queries on IEnumerable defer until enumeration (foreach, ToList). Multiple enumerations re-run pipeline. IQueryable pushes expression to provider (EF SQL). 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: Junior.
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