Avatar ·

Retornar IEnumerable<T> ou IQueryable<T> em C#: qual a diferença e o que escolher?

Olá a todos! Sou um desenvolvedor C# iniciante, trabalho com Entity Framework e LINQ. Frequentemente vejo no código dos colegas que eles retornam de métodos às vezes `IEnumerable`, às vezes `IQueryable`. No começo, pensei que eram intercambiáveis, mas depois notei um comportamento estranho. Aqui está um exemplo. Tenho um método que obtém uma lista de pedidos: ```csharp public IEnumerable GetOrders() { using (var db = new MyDbContext()) { return db.Orders.Where(o => o.IsActive); } } ``` Depois eu o chamo e aplico uma filtragem adicional: ```csharp var orders = GetOrders().Where(o => o.Total > 100).ToList(); ``` Eu esperava que fosse enviado ao banco uma única consulta SQL com duas condições (`IsActive = true AND Total > 100`), mas o profiler mostra que primeiro são selecionados todos os pedidos ativos, e depois a filtragem por `Total` ocorre na memória da aplicação! Isso é extremamente lento se houver muitos pedidos. E se eu mudo o tipo de retorno para `IQueryable`, tudo funciona como esperado — no SQL é gerado