实体框架响应速度慢,但是生成的查询在SqlDeveloper工作表中运行很快

时间:2019-03-11 10:42:46

标签: c# oracle entity-framework

我在Oracle 12c数据库中有3个表。

  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 个答案:

答案 0 :(得分:1)

基于对问题的评论,我使用流利的api添加了.HasColumnType("VARCHAR2")配置,如下所示:

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

添加此配置后,查询在16 milliseconds中响应。 但是,它不会将Type=Object更改为Type=String。它只是加快。 谢谢大家!