Я не уверен, что DbSet, предоставляемый первым кодом, фактически использует ObjectQuery, но вы можете попытаться вызвать для них метод .ToTraceString (), чтобы увидеть, какой SQL генерируется, например:
var query = myContext.Documents.Where(o => o.ID == 2);
Debug.WriteLine(query.ToTraceString());
Как только вы получите SQL, вы можете определить, является ли запрос или EF причиной задержки. В зависимости от сложности вашего базового класса запрос может включать в себя множество дополнительных столбцов, которых можно избежать с помощью проекции. Используя проекции, вы можете выполнить запрос следующим образом:
var query = from d in myContext.Documents
where d.ID == 2
select new
{
o.Id
};
Это должно в основном выполнить запрос SELECT ID FROM Documents WHERE ID = 2
, и вы можете измерить, сколько времени потребуется, чтобы получить дополнительную информацию. Конечно, спроектированный запрос может не соответствовать вашим потребностям, но он может привести вас на правильный путь. Если это все еще занимает до 5 секунд, вам следует изучить проблемы с производительностью самой базы данных, а не EF.
Обновление
Очевидно, с помощью code-first вы можете использовать .ToString () вместо .ToTraceString (), спасибо Slauma за то, что обратили внимание.