Entity Framework отвечает медленно, но сгенерированный запрос выполняется быстро в рабочем листе SqlDeveloper - PullRequest
1 голос
/ 11 марта 2019

У меня есть 3 таблицы в базе данных Oracle 12c.

  1. MainTable(Id number, Table1_Id number, Table2_Id number)
  2. Table1(Id number, Registration_Date date, Kind_Id number)
  3. Table2(Id number, Pin)

Итак, я написал следующий код мира, используя платформу сущностей:

dbContext.Set<MainTable>
         .Where(mt => mt.Table2.Pin == pin && pd.Table1.KindId == kindValue)
         .Select(pd => new { pd.Id, pd.Table1.RegistrationDate })
         .ToList();

В этом операторе тип pin переменной равен string, а тип kindValue равен int. Когда я запускаю этот код, EF генерирует следующий запрос:

Opened connection at 11-Mar-19 14:31:05 +04:00

SELECT 
"Extent1"."ID" AS "ID", 
"Extent3"."REGISTRATION_DATE" AS "REGISTRATION_DATE"
FROM   "SCHEMA_NAME"."MAIN_TABLE" "Extent1"
INNER JOIN "SCHEMA_NAME"."TABLE2" "Extent2" ON "Extent1"."TABLE2_ID" = "Extent2"."ID"
INNER JOIN "SCHEMA_NAME"."TABLE1" "Extent3" ON "Extent1"."TABLE1_ID" = "Extent3"."ID"
WHERE ((("Extent2"."PIN" = :p__linq__0) OR (1 = 0)) AND ("Extent3"."KIND_ID" = :p__linq__1))

-- p__linq__0: '7E998YT' (Type = Object)
-- p__linq__1: '1' (Type = Int32, IsNullable = false)
-- Executing at 11-Mar-19 14:31:05 +04:00
-- Completed in 5822 ms with result: OracleDataReader

Closed connection at 11-Mar-19 14:31:11 +04:00

Когда я выполняю этот запрос в SQL Developer worksheet, тогда запрос дает результат в 0.0032 секунд, но EF выполняет 5.822 секунд. Я не понимаю, почему это происходит. Кто-нибудь может объяснить, почему возникает такая разница во времени выполнения?

Еще одна интересная вещь - EF генерирует условие OR (1 = 0) в запросе. В чем моя ошибка?

1 Ответ

1 голос
/ 11 марта 2019

Основываясь на комментариях к сессии, я добавил .HasColumnType("VARCHAR2") конфигурацию, используя свободный API следующим образом:

Property(m => m.Pin)
   .HasColumnName("PIN")
   .IsRequired()
   .HasColumnType("VARCHAR2");

После добавления этого запроса на ответ ответили 16 milliseconds. Но это не меняет Type=Object на Type=String. Это просто ускорить. Спасибо за все!

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