我在Oracle 12c数据库中有3个表。
MainTable(Id number, Table1_Id number, Table2_Id number)
Table1(Id number, Registration_Date date, Kind_Id number)
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)
条件。我怎么了?
答案 0 :(得分:1)
基于对问题的评论,我使用流利的api添加了.HasColumnType("VARCHAR2")
配置,如下所示:
Property(m => m.Pin)
.HasColumnName("PIN")
.IsRequired()
.HasColumnType("VARCHAR2");
添加此配置后,查询在16 milliseconds
中响应。
但是,它不会将Type=Object
更改为Type=String
。它只是加快。
谢谢大家!