Я подозреваю, что виновником является не утечка памяти, а довольно неудачное дополнение к EF Core, Оценка клиента .Как и LINQ-to-SQL, при работе с лямбда / функцией, которую нельзя преобразовать в SQL, EF Core создаст более простой запрос, который читает more data и оценивает функцию на клиенте.
В вашем случае EF Core не может знать, что такое TestPredicate
, поэтому прочитает каждую запись в памяти и попытается впоследствии отфильтровать данные.
BTW это то, что произошло , когда SO переместился в EF Core в прошлый четверг, 4 октября 2018 года. Вместо того, чтобы возвращать несколько десятков строк, запрос вернул ... 52 миллиона строк:
var answers = db.Posts
.Where(p => grp.Select(g=>g.PostId).Contains(p.Id))
...
.ToList();
Оценка клиентане является обязательным, но включен по умолчанию.EF Core регистрирует предупреждение каждый раз, когда выполняется оценка клиента, но это не поможет, если вы не настроили ведение журнала EF Core.
Безопасное решение - отключить оценку на стороне клиентакак показано в Необязательное поведение: генерировать исключение для клиентской оценки раздела документации, либо в методе OnConfiguring
каждого контекста, либо глобально в конфигурации Startup.cs:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(...)
.ConfigureWarnings(warnings =>
warnings.Throw(RelationalEventId.QueryClientEvaluationWarning));
}
ОБНОВЛЕНИЕ
Быстрый способ выяснить, что происходит, - это сделать два снимка памяти в окне диагностики и проверить, какие новые объекты были созданы и сколько памяти они используют.Вполне возможно, что в оценке клиента есть ошибка.