2012-01-17 34 views
8

Oracleが直前にリリースした新しいODACでEntity Frameworkを使用しています。ODAC 11.2リリース4(11.2.0.3.0)「Oracle 11.2.0.2.0はAPPLYをサポートしていません」例外が発生しました

私の問題は、以前のベータ版で動作していたクエリの一部がこの新しいリリース版で動作しなくなったことです。ここで

は例です:

IQueryable<SYS_PERFIL> query1 = m.DBContext.SYS_PERFIL.Where(T => T.SYS_UTILIZADOR.Where(TT => TT.ACTIVO == 1).Count() > 0); 

IQueryable<SYS_PERFIL> query2 = m.DBContext.SYS_PERFIL.Where(T => T.SYS_UTILIZADOR.FirstOrDefault(TT => TT.ACTIVO == 1) != null); 

string test1Query = ((System.Data.Objects.ObjectQuery)query1).ToTraceString(); 

string test2Query = ((System.Data.Objects.ObjectQuery)query2).ToTraceString(); 

var test1 = query1.ToList(); 

var test2 = query2.ToList(); 

test1のはcurrect結果を返しますが、TEST2がOracle例外 'ORA-00905を:不足しているキーワード' スローメッセージを持つ: 'オラクル11.2.0.2.0が適用をサポートしていません' 。

すべての方法を再テストしたくありません。 EFに申し込みを使わないように指示する方法はありますか?

test1Query:

SELECT "Project1"."PERFIL_ID" AS "PERFIL_ID" FROM (SELECT "Extent1"."PERFIL_ID" AS PERFIL_ID", (SELECT COUNT(1) AS "A1" FROM "SMI2012"."SYS_UTILIZADOR" "Extent2" WHERE (("Extent1"."PERFIL_ID" = "Extent2"."PERFIL_ID") AND (1 = "Extent2"."ACTIVO"))) AS "C1" 
FROM "SMI2012"."SYS_PERFIL" "Extent1") "Project1" WHERE ("Project1"."C1" > 0) 

test2Query:事前に

SELECT "Extent1"."PERFIL_ID" AS "PERFIL_ID" FROM "SMI2012"."SYS_PERFIL" "Extent1" CROSS APPLY (SELECT "Extent2"."PERFIL_ID" AS "PERFIL_ID", "Extent2"."ACTIVO" AS "ACTIVO", "Extent2"."USER_ID" AS "USER_ID" FROM "SMI2012"."SYS_UTILIZADOR" "Extent2" WHERE (("Extent1"."PERFIL_ID" = "Extent2"."PERFIL_ID") AND (1 = "Extent2"."ACTIVO")) AND (ROWNUM <= (1))) "Element1" WHERE ("Element1"."USER_ID" IS NOT NULL) 

おかげでここ

はEFが発生していることをクエリがあります。

+4

この問題を解決しましたか?私は、投影内でFirstOrDefaultを使用しようとすると同じ問題が発生しています。 –

+0

最初のレコードが得られたかどうか気にしないと仮定すると、.FirstOrDefaultの代わりに.Minを使用できます。 –

答えて

0

Telerik OpenAccess ORMは、APPLYステートメントを使用しません。私はネストされたグループクエリで同じ問題を抱えていました。私がOAモデルを構築したとき、クエリはうまくいった!

0

これは12cでのみ機能します。 11gでは、クエリを書き直す必要があります。

IQueryable<SYS_PERFIL> query2 = from one in m.DBContext.SYS_PERFIL 
    join two in m.DBContext.SYS_UTILIZADOR on one.COL1 equals two.COL1 
    where two.ACTIVO == 1 
    select one; 

使用すると、1つのアクティブSYS_UTILIZADOR以上のものを持っている場合、これは重複を生成します。その場合、あなたはそれを区別する必要があります。これにより、多数の行に対して非常に優れたパフォーマンスが得られるわけではありません。小さい数字でOKである必要があります。

関連する問題