簡體   English   中英

禁用 CAST AS 以優化實體框架中的查詢

[英]Disable CAST AS to optimize query in 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

遲到總比不到好)

如果您使用代碼優先和手動映射類,請對 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");

在數據庫和對象屬性中使用(短?)來執行 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));

發送到 Oracle 的 SQL:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM