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

时间:2014-07-17 10:53:00

标签: c# sql oracle entity-framework

我正在使用 Entity Framework 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

2 个答案:

答案 0 :(得分:3)

晚于永远不会好过)

如果您正在使用代码优先和手动映射类,请对int属性使用HasColumnType(" INT")配置。

例如:

var entity = builder.Entity<APP_TABLE>();

entity
    .HasKey(x => x.ID)
    .ToTable("APP_TABLE", "SCHEMA");

entity
    .Property(x => x.ID)
    .HasColumnType("INT");

答案 1 :(得分:0)

在数据库和对象属性中使用(短?)来执行 IQyueryable 时,我遇到了类似的问题。

当使用 Equal() 时,它通常会在代码中产生一些错误。使用简单比较时,T-SQL 在查询的两侧发送 CAST()。坏处:在 Transact SQL 中使用 CAST 时,Oracle 不使用 INDEXES,在数据库中直接执行一个以毫秒为单位运行的简单选择,以这种方式运行时会持续很久

使用这种方法,TSQL 无需强制转换即可转换为 OR,这比使用 CAST 更轻松。在使用不可空字段的情况下,or不会出现,性能非常高

在某些情况下,使用 Equal() 摆脱了强制转换,但它似乎不适用于 short?

Lambda:

if (filter.Property.HasValue)
    query = query.Where(w => new short?[] { 
filter.Property}.Contains(w.Property));

发送到 Oracle 的 SQL:

WHERE (("Extent1"."Property" = :p__linq__0) OR (("Extent1"."Property" IS NULL) AND (:p__linq__0 IS NULL)))