[英]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.