IEnumerable e IQueryable: Otimize suas Consultas em .NET

Imagine que você está num restaurante:

Entender essa diferença evita que sua aplicação vire um "buffet indesejado" que sobrecarrega o sistema! 🚀

📚 Índice🔗

🧠 O Que São?🔗

IEnumerable<T>

List<Produto> produtos = GetProdutosFromMemory();
IEnumerable<Produto> filtrados = produtos.Where(p => p.Preco > 100); // Executado na memória

IQueryable<T>

IQueryable<Produto> query = _context.Produtos.AsQueryable();
var filtrados = query.Where(p => p.Preco > 100); // Gera SQL com WHERE Preco > 100

⚔️ Diferenças Chave🔗

CaracterísticaIEnumerableIQueryable
Execução da QueryCliente (in-memory)Servidor (ex: banco)
ProviderLINQ to ObjectsLINQ to SQL/Entity/etc.
Uso de RecursosConsome mais memóriaOtimiza uso do servidor
ComposiçãoOperações sequenciaisPode ser modificada dinamicamente

🎯 Quando Usar Cada Um🔗

Use IEnumerable Quando:

Use IQueryable Quando:

💣 Armadilhas Comuns🔗

Materialização Prematura

// ERRO: Converte para IEnumerable antes do filtro!
var produtos = _context.Produtos.ToList() // Carrega TUDO
                  .Where(p => p.Categoria == "Eletrônicos");
// CORRETO: Mantém como IQueryable
var produtos = _context.Produtos
                  .Where(p => p.Categoria == "Eletrônicos")
                  .ToList(); // Executa SQL filtrado

Mix Improvisado

var query = _context.Produtos.AsQueryable();
// IQueryable até aqui
query = query.Where(p => p.Preco > 100);
// IEnumerable daqui pra frente!
var resultado = query.AsEnumerable()
                  .Where(p => p.Nome.Contains("Gamer")); // Filtro em memória

🧪 Exemplo Prático: Banco de Dados vs. Memória🔗

Cenário: Filtrar 1 milhão de produtos🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. por preço e categoria.

Caso 1: IEnumerable

var todosProdutos = _context.Produtos.ToList(); // Traz 1MM registros
var filtrados = todosProdutos
    .Where(p => p.Preco > 100 && p.Categoria == "Tech"); // Filtro em memória

Problema🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes.: Consome muita memória e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. processamento local.

Caso 2: IQueryable

var query = _context.Produtos
    .Where(p => p.Preco > 100 && p.Categoria == "Tech")
    .ToList(); // SQL: SELECT ... WHERE Preco > 100 AND Categoria = 'Tech'

Vantagem: Banco processa o filtro🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio., retorna apenas resultados relevantes.

⏱️ Performance: Teste de Cenários Reais🔗

MétricaIEnumerable (1MM itens)IQueryable (SQL Server)
Tempo Execução850ms120ms
Memória Consumida500MB2MB
Tráfego Rede1MB (todos os dados)5KB (apenas resultados)

🏆 Melhores Práticas🔗

1. Mantenha IQueryable o máximo🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. possível em consultas🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. a bancos

2. Use AsEnumerable() após filtrar🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! processamento local

3. Evite ToList() prematuro – só materialize quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. necessário

4. Combine os dois quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. necessário:

// Filtro no banco
var query = _context.Vendas.AsQueryable()
    .Where(v => v.Data.Year == 2024);
// Processamento final em memória
var resultado = query.AsEnumerable()
    .GroupBy(v => v.Mes)
    .Select(g => new { Mes = g.Key, Total = g.Sum(v => v.Valor) });
💡 Dica de Ouro: Use var e observe o tipo no IntelliSense – ele revela se você está usando IEnumerable ou IQueryable!

Conclusão🔗

A escolha entre IEnumerable e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. IQueryable faz toda a diferença em termos de performance🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!🔄 StringBuilder: Quando Concatenar Strings Vira um Pesadelo!Descubra como o StringBuilder otimiza a concatenação em C#, evitando desperdício de memória e melhorando a performance das aplicações. Veja exemplos práticos!, especialmente quando se fala em bancos de dados ou grandes coleções. Enquanto o IEnumerable é útil para coleções que já estão em memória, o IQueryable brilha quando precisamos fazer consultas🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. sofisticadas em fontes externas, priorizando a economia de recursos.

Entender essa diferença e usar cada interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. no momento certo é essencial para não travar o sistema e conseguir resultados rápidos e eficientes.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados