IEnumerable vs IQueryable in C# comparison showing differences, performance, and when to use with examples

IEnumerable vs IQueryable in C# with Examples: Differences, Performance, and When to Use

What is IEnumerable in C#?

Key Points

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> {1, 2, 3, 4, 5};

        IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0);

        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}
2
4

What is IQueryable in C#?

Key Points

Example:

using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;

class Program
{
    static void Main()
    {
        using (var context = new AppDbContext())
        {
            IQueryable<User> activeUsers = context.Users
                                                  .Where(u => u.IsActive);

            foreach (var user in activeUsers)
            {
                Console.WriteLine(user.Name);
            }
        }
    }
}

Explanation:

Difference Between IEnumerable and IQueryable in C#

Example: IEnumerable vs IQueryable

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // IEnumerable example
        List<int> numbers = new List<int> {1, 2, 3, 4, 5};
        IEnumerable<int> inMemoryQuery = numbers.Where(n => n > 2); // executed in memory

        // IQueryable example (simulated)
        IQueryable<int> dbQuery = numbers.AsQueryable().Where(n => n > 2); // would be         executed on a database in real-world EF Core

        Console.WriteLine("IEnumerable Result:");
        foreach (var n in inMemoryQuery) Console.WriteLine(n);

        Console.WriteLine("IQueryable Result:");
        foreach (var n in dbQuery) Console.WriteLine(n);
    }
}

Which Is Faster: IQueryable or IEnumerable?

Why Does Performance Differ?

Using IEnumerable (Can Be Slow)

var users = context.Users.ToList(); // Loads all records

var filteredUsers = users.Where(u => u.Age > 25); // Filtering in memory

Using IQueryable (Better Approach)

var users = context.Users.Where(u => u.Age > 25);

var result = users.ToList(); // Query runs here
SELECT * FROM Users WHERE Age > 25

Quick Comparison

Should Repository Return IQueryable or IEnumerable?

Why Not Return IQueryable?

Problems with Returning IQueryable

Why IEnumerable is Safer

Example:

public IEnumerable<User> GetUsers()
{
    return context.Users
                  .Where(u => u.IsActive)
                  .ToList();
}

When Can You Use IQueryable?

Use IQueryable if:

Example:

public IQueryable<User> GetUsers()
{
    return context.Users; // Allows further filtering
}

Best Practice (Recommended Approach)

public IEnumerable<User> GetUsersAboveAge(int age)
{
    return context.Users
                  .Where(u => u.Age > age)
                  .ToList();
}

Conclusion

Related Articles

Leave a Comment

Your email address will not be published. Required fields are marked *