禁用CAST AS以优化实体框架中的查询

本文关键字:框架 查询 实体 优化 CAST AS 禁用 | 更新日期: 2023-09-27 18:13:23

我使用实体框架5,我想从Oracle 10g数据库选择数据。问题是数据库表太大,Entity Framework生成的查询是无效的。我想去掉这些CAST( [column] AS [type] )。有什么设置可以关闭它们吗?

c#代码:

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

禁用CAST AS以优化实体框架中的查询

晚做总比不做好

如果你使用代码优先和手动映射类,使用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)))