禁用CAST AS以优化实体框架中的查询
本文关键字:框架 查询 实体 优化 CAST AS 禁用 | 更新日期: 2023-09-27 18:13:23
我使用实体框架5,我想从Oracle 10g数据库选择数据。问题是数据库表太大,Entity Framework生成的查询是无效的。我想去掉这些CAST( [column] AS [type] )
。有什么设置可以关闭它们吗?
var context = new APPDB();
var q = context.APP_TABLE.Where(i => i.ID == 123);
// This is how I did get the generated SQL query
var str = ((System.Data.Objects.ObjectQuery) q ).ToTraceString();
生成的查询:
SELECT
CAST( "Extent1"."ID" AS number(10,0)) AS "C1",
"Extent1"."DESCRIPTION" AS "DESCRIPTION"
FROM "APP"."APP_TABLE" "Extent1"
WHERE (123 = ( CAST( "Extent1"."ID" AS number(10,0))))
我想要的是生成性能更好的查询的代码:
SELECT
"Extent1"."ID" AS "C1",
"Extent1"."DESCRIPTION" AS "DESCRIPTION"
FROM "APP"."APP_TABLE" "Extent1"
WHERE
"Extent1"."ID" = 123
晚做总比不做好
如果你使用代码优先和手动映射类,使用HasColumnType("INT")配置的INT属性。
例如:var entity = builder.Entity<APP_TABLE>();
entity
.HasKey(x => x.ID)
.ToTable("APP_TABLE", "SCHEMA");
entity
.Property(x => x.ID)
.HasColumnType("INT");
在数据库和对象属性中使用(short?)来执行IQyueryable时,我遇到了类似的问题。
当使用Equal()时,它通常会在代码中产生一些错误。当使用简单比较时,T-SQL在查询的两边发送CAST()。不好的事情是:当在Transact SQL中使用CAST时,Oracle不使用INDEXES,直接在数据库中进行一个简单的选择,在几毫秒内运行,当以这种方式运行时,将花费一个永恒
使用这种方法,TSQL在转换时不需要将其强制转换为OR,这比使用cast更省事。如果使用非空字段,则不会出现or,从而使性能非常高
在某些情况下,使用Equal()可以摆脱强制转换,但它似乎不适用于short?
λ:
if (filter.Property.HasValue)
query = query.Where(w => new short?[] {
filter.Property}.Contains(w.Property));
SQL发送给Oracle:
WHERE (("Extent1"."Property" = :p__linq__0) OR (("Extent1"."Property" IS NULL) AND (:p__linq__0 IS NULL)))