EF быстро вызывает и возвращает хранимую процедуру, но затем ее преобразование в список занимает 20 секунд для 1000 записей - PullRequest
0 голосов
/ 07 сентября 2018

Я отлаживаю фрагмент кода, который использует EF в качестве ORM. Теперь я вижу несколько интересное поведение из приложения:

Это код, где я вызываю хранимую процедуру:

List<RequestListEntity> results = new List<RequestListEntity>();
var temp = System.Data.Object.ObjectContext.ExecuteFunction<T>("storedProcedure", param);

foreach (var item in temp)
{
    results.Add(item);
}

Замечания:

  1. Когда я запускаю хранимую процедуру на сервере, она очень быстрая. У него есть соединения с таблицами, но он возвращает 1000 записей в секунду
  2. Когда я вызываю хранимую процедуру из C #, используя код, показанный выше, она также возвращается через секунду и возвращает objectResult<T> с общим количеством записей 1000.
  3. Теперь, когда я пытаюсь перебрать результат ИЛИ , пытаясь преобразовать результат в список, он чертовски медленнее.

Теперь возникает много вопросов:

  1. Если он возвращается из БД так быстро, то почему простое преобразование 1000 записей занимает так много времени? Или, может быть, он все еще возвращается в БД для конвертации?
  2. Могу ли я что-нибудь сделать, чтобы сделать это быстро? Когда он вызывает функцию, он возвращается очень быстро.

1 Ответ

0 голосов
/ 07 сентября 2018

Проблема производительности связана с отложенной загрузкой и отслеживанием объектов. когда этот метод с именем result сопоставляется с типом объекта, при выполнении context.Database.SqlQuery не происходит две вещи:

  • Объекты отслеживаются трекером изменения контекста.
  • Объекты выполняют ленивую загрузку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...