Фильтрация после ToListAsync: почему такой метод опасен
В репозитории есть метод:
public async Task<List<Order>> GetBigOrdersAsync(decimal min)
{
var all = await db.Orders.ToListAsync();
return all.Where(o => o.Total > min).ToList();
}
В таблице orders около 4 млн строк, условию обычно удовлетворяют десятки. В чём главная проблема?
- Проблема только в лишнем вызове ToList в конце — на потребление памяти это почти не влияет
- Ничего страшного: EF анализирует последующие вызовы LINQ и всё равно добавит WHERE в итоговый SQL, так что из базы приедут только нужные строки
- Запрос гарантированно упадёт по таймауту команды на любой таблице такого размера
- После ToListAsync данные уже в памяти приложения: из базы приезжают все 4 млн строк, а фильтр работает по объектам
