我正在使用 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
答案 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)))