f you’re new to C# and LINQ, two interfaces cause big confusion: IEnumerable<T> and IQueryable<T>. This guide explains them like you’re brand-new, with simple code, clear rules, and SEO-friendly answers to “What is IQueryable vs IEnumerable,” “difference between them,” and “which is better.”
Quick Summary
IEnumerable<T>→ works in memory (LINQ to Objects). Best when the data is already loaded (Lists, Arrays, Dictionaries).IQueryable<T>→ builds a query for the data source (LINQ to SQL/EF Core). Best for databases/remote APIs; lets the server do the heavy lifting.- Both are deferred: they run when you enumerate (e.g.,
foreach,ToList()).
What is IEnumerable<T>?
- Think “loop through items I already have.”
- Runs inside your app.
- Great for small/medium in-memory collections.
var numbers = new List<int> { 1, 2, 3, 4, 5 };
// IEnumerable<T>: filters in memory
IEnumerable<int> evens = numbers.Where(n => n % 2 == 0);
foreach (var n in evens) // executes on enumeration
Console.WriteLine(n);
Use it when: the data is already in memory or you need C#-only operations after loading.
What is IQueryable<T>?
- Think “compose a query; let the DB do work.”
- Builds an expression tree that Entity Framework Core (or another LINQ provider) translates to SQL.
- Filters/sorts on the server, so you fetch only what you need.
// EF Core example
IQueryable<User> users = dbContext.Users;
var recent = users
.Where(u => u.IsActive && u.CreatedAt >= DateTime.UtcNow.AddDays(-7))
.Select(u => new { u.Id, u.Email });
var list = await recent.ToListAsync(); // SQL runs here
Use it when: querying databases/remote sources, especially large datasets.
Key Differences: IQueryable vs IEnumerable (Table)
| Topic | IEnumerable<T> | IQueryable<T> |
|---|---|---|
| Where it executes | Client (in memory) | Server (data source) |
| Typical source | Lists, arrays | EF Core DbSet<T>, OData, Mongo providers |
| How it works | C# delegates | Expression trees → translated to SQL |
| Performance | Loads then filters | Filters before loading |
| When to pick | Data already loaded | Need server-side filtering/projection |
| Gotcha | Slow on huge collections | Non-translatable methods force client eval |
Which Is Better?
It depends on where your data lives.
- Choose
IQueryable<T>for databases or big datasets → better performance, less memory, less network I/O. - Choose
IEnumerable<T>for in-memory work or when you intentionally need client-side logic.
Pro tip: Start queries as IQueryable<T>, materialize late with ToListAsync(). If you must run a custom C# method, switch at the last moment:
var query = dbContext.Products
.Where(p => p.Price > 100) // server
.Select(p => new { p.Id, p.Name });
var result = (await query.ToListAsync()) // materialize
.OrderBy(p => FancyRank(p.Name)) // client-only
.ToList();
Common Pitfalls (and Easy Fixes)
- Client evaluation by accident
- Symptom: Slow queries, high memory usage.
- Fix: Keep non-translatable methods after materialization (
ToList()/AsEnumerable()).
- Multiple DB hits
- Symptom: Query runs several times.
- Fix: Cache with
ToList()if you need to iterate more than once.
- Using
IEnumerable<T>against a database- Symptom: Loads too much data into memory.
- Fix: Start from
DbSet<T>asIQueryable<T>and filter first.
Example: Count active users (server-side)
int count = await dbContext.Users
.Where(u => u.IsActive)
.CountAsync();
Example: After materialization, use C#-only logic
var names = (await dbContext.Users
.Where(u => u.IsActive)
.Select(u => u.Name)
.ToListAsync()) // DB work done
.Where(NameLooksSpecial); // pure C# predicate
FAQ (Quick Answers)
What is the difference between IQueryable and IEnumerable in C#?IEnumerable<T> runs in memory for already-loaded collections. IQueryable<T> composes queries that run on the data source (e.g., SQL via EF Core), sending back only the needed results.
Which is better: IQueryable or IEnumerable?
For database queries and large datasets, IQueryable<T> is better. For in-memory collections or when you need C#-only operations, use IEnumerable<T>.
Interview Questions (Use in Tech Screens)
- Explain how
IQueryable<T>uses expression trees.
What happens if the LINQ provider can’t translate a method to SQL? Give an example and the impact on performance. - When would you switch from
IQueryable<T>toIEnumerable<T>usingAsEnumerable()orToList()?
Describe the risks of switching too early vs. too late.

