Qual a diferença entre IEnumerable, IQueryable e List?

IEnumerable, IQueryable e List são todos tipos de coleções no .NET Framework, mas possuem algumas diferenças conceituais e de uso.

IEnumerable é uma interface que define um comportamento básico de iteração sobre uma coleção. Ela permite que você percorra sequencialmente os elementos em uma coleção, mas não fornece funcionalidades como filtragem ou ordenação. Você pode usar métodos como foreach e LINQ (Language Integrated Query) para manipular uma coleção que implementa a interface IEnumerable.

Por outro lado, IQueryable também é uma interface, mas oferece uma funcionalidade adicional em relação a IEnumerable. O IQueryable permite que você execute consultas dinâmicas em uma fonte de dados, como um banco de dados, através de provedores de consulta. Ele é útil quando você precisa obter dados de uma origem remota, como um banco de dados SQL. Ao utilizar IQueryable, você pode escrever consultas complexas, aplicar filtros e projeções, e o provedor de consulta irá traduzir essas operações para o formato apropriado para a fonte de dados.

Já List é uma classe concreta que implementa a interface IEnumerable. Diferentemente das interfaces IEnumerable e IQueryable, List possui um conjunto de operações mais amplo para manipulação de dados, incluindo adicionar, remover e pesquisar elementos. List é uma coleção indexada, o que significa que os elementos são acessados por meio de um índice numérico. É útil quando você precisa armazenar e manipular uma coleção de elementos em memória.

Resumindo, IEnumerable é a interface mais básica, IQueryable é usada para realizar consultas dinâmicas em fontes de dados remotas, enquanto List é uma classe concreta que oferece uma variedade de operações para manipulação de dados em memória.

Aqui está um exemplo de código que ilustra a diferença entre esses três conceitos:

// Exemplo usando IEnumerable
IEnumerable<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var filteredNumbers = numbers.Where(n => n % 2 == 0);

// Exemplo usando IQueryable
IQueryable<int> dbQuery = dbContext.SomeTable;
var filteredQuery = dbQuery.Where(n => n % 2 == 0);

// Exemplo usando List
List<int> numberList = new List<int> { 1, 2, 3, 4, 5 };
numberList.Add(6);
numberList.Remove(3);

No exemplo acima, nós usamos a interface IEnumerable para percorrer os números em uma coleção e filtrar apenas os números pares. Com IQueryable, realizamos uma consulta em uma fonte de dados externa, como um banco de dados. E com List, podemos adicionar e remover números da coleção em memória.