Я работаю в Entity Framework Core 1.1.0 (и на данный момент обновление недоступно из-за критических изменений в более поздних версиях). Мой запрос имеет следующий вид:
var q = db.MyTable
.GroupBy(t => new { t.Field1 })
.Select(g => new
{
g.Key.Field1,
MaxField2 = g.Max(x => x.Field2)
})
.ToList();
В тестовом коде это работает хорошо и возвращает ожидаемые данные. Но при развертывании в реальной среде с реальными данными время ожидания истекает. Почему? Итак, я поставил сниффер на SQL-сервер, и вот собственно SQL:
SELECT [t].[Field1], [t].[Field2], [t].[Field3], [t].[Field4], [t].[Field5]
FROM [dbo].[MyTable] AS [t]
ORDER BY [t].[Field1]
Ой. Ну это бы объяснило. EF только компилирует запрос до .GroupBy()
в SQL, таким образом пытаясь загрузить все содержимое таблицы (около 17 миллионов записей на момент написания) в память, а остальную часть группировки и порядок должен быть сделан в памяти.
Любые предложения, как переработать этот запрос, чтобы тяжелая работа выполнялась в SQL?
Expression<Func<>>
и работать с ними. Я не думаю, что кто-то захочет перестраивать вашу структуру БД с нуля, работать со старой версией EF Core и полностью отлаживать ее за вас. - person Matthias Burger   schedule 19.07.2017Sum
:) - person Ivan Stoev   schedule 19.07.2017